转载请注明出处。chendesheng1988是原作者。

问题描述:射频模块读取证件信息后,串口读取的信息存到SD卡,存进去发现汉字是乱码。

解决方案:使用函数WideCharToMultiByte搞定这个问题。

关键词:unicode,ANSI,WideCharToMultiByte,LPCWSTR

解决的过程大概描述如下:

(1)把存放从串口读进来的数据的recvBuf进行强制类型转换,(LPCWSTR)recvBuf,既表示转换为32位的unicode码,也是为了满足WideCharToMultiByte函数第三个参数类型的要求

(2)根据WideCharToMultiByt函数参数的要求,定义一个接收转换后字符的buffer。可以定义为char *buffer;

int WideCharToMultiByte(

UINT CodePage,

DWORD dwFlags,

LPCWSTR lpWideCharStr,

int cchWideChar,

LPSTR lpMultiByteStr,

int cbMultiByte,

LPCSTR lpDefaultChar,

LPBOOL lpUsedDefaultChar

);

(3)再利用这个函数计算recvBuf的size,方法如下:

int size = WideCharToMultiByte(CP_ACP, 0, (LPCWSTR)recvBuf, -1, NULL, 0, NULL, NULL);

(4)再次利用这个公式进行宽字符到多字节的转换,方法如下:

WideCharToMultiByte(CP_ACP, NULL, (LPCWSTR)recvBuf, -1, buffer, size + 1, NULL, NULL);

(5)最后利用fputc函数将,将这个buffer里的内容存到SD卡即可。方法如下:

FILE *out=NULL;

if((out=fopen("\\Storage Card\\IDinfo.txt","a+"))==NULL)

{

printf("can not open file! \n");

exit(0);

}

else

printf(" open file sucess! \n");

for(i=9;i<165;i++)  //这里i的起始和终止条件是根据我的需要设的,不要奇怪

{

wchar_t ch =buffer[i];

fputc(ch,out);

}

fclose(out);

(6)使用这个方法后,我很激动把SD卡里的IDinfo.txt文件拷贝到PC上,打开那一瞬间,整整齐齐的汉字出现在我的面前,再也不是以前的乱码了。兴奋。

结语:虽然方法简单的说大概是这么个样子,但里面涉及的字符编码格式很值得我再去认真研究,搞清楚wince里的unicode,以及ANSI标准。还是愿意再写一篇学习心得,有关于这个字符编码的。在解决问题的过程中,在网上查找了大量的资料,非常感谢那些愿意在网上公开免费的分析自己知识的前辈们。我也乐于把我的心得跟大家分享。

我的SD卡乱码解决方案的更多相关文章

  1. 3、树莓派的配置:改静态IP、连接ssh、安装中文字体、安装谷歌输入法、增加USB电流、修改触摸屏分辨率、扩展sd卡空间、修复vi和vim乱码问题、安装配置远程桌面vnc

    本博文仅作本人操作过程的记录,留作备忘.自强不息 QQ1222698 1.连接上HDMI线,插上触摸屏,插上键盘,鼠标,网线,启动.系统正常启动,但是一直闪烁,不停的黑屏,是由于触摸屏的usb口供电不 ...

  2. 6、android 普通日志输出到SD卡

    这是本人见过写博文最负责的一个人: http://www.crifan.com/android_try_use_android_logging_log4j_to_output_log_to_sd_ca ...

  3. Ye.云狐J2刷机笔记 | 完美切换内部存储卡和SD卡的改法.vold.fstab

    ================================================================================Ye.完美切换内部存储卡和SD卡成功.v ...

  4. 蜂鸟A20开发板刷 cubietruck 的 SD 卡固件

    美睿视讯 为蜂鸟A20准备的 MerriiLinux 功能非常简陋.所以能用上主流的 debian 或者 LUbuntu 就可以说是非常迫切的需求了.蜂鸟A20(Merrii Hummingbird ...

  5. SPI模式下MCU对SD卡的控制及操作命令

    一.前言 SD 卡有两个可选的通讯协议:SD 模式和 SPI模式 SD 模式是SD 卡标准的读写方式,但是在选用SD 模式时,往往需要选择带有SD 卡控制器接口的 MCU,或者必须加入额外的SD卡控制 ...

  6. 创见WiFi SD卡破解之路

    我最近搞了张Transcend WiFi SD,颇为得意.它可以让我在几秒钟内将单反(奶昔,相当便携)中拍摄的照片传到任何支持wifi的设备上.我很喜欢在旅途中拍摄和分享图片,所以对我而言,可以无线传 ...

  7. Android开发之下载Tomcat服务器的文件到模拟器的SD卡

    Tomcat服务器可以到Apache的官网去下载http://tomcat.apache.org/,如何配置和使用百度下也有很多介绍,只要把Java的SDK配下java_home环境变量就行了,因为T ...

  8. 4安德鲁斯.2.2在系统,具有系统权限的应用程序无法读取或写入SD卡

    有两个解决方案: 1.通过改动android系统的源代码,开放SD卡的读写权限,具体的改动方法和说明.能够參考网上资料http://www.ifeegoo.com/android-debug-stat ...

  9. SPI模式下MCU对SD卡的控制及操作命令(转)

    源:SPI模式下MCU对SD卡的控制及操作命令 一.前言 SD 卡有两个可选的通讯协议:SD 模式和 SPI模式 SD 模式是SD 卡标准的读写方式,但是在选用SD 模式时,往往需要选择带有SD 卡控 ...

随机推荐

  1. 画年利率 画图 自定义 View

    使用 SlbSyView slbView; slbView = (SlbSyView) findViewById(R.id.slbView); slbView.setHeights(new float ...

  2. 95秀-弹窗+listview+动画 示例

    Dialog布局 dialog.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLay ...

  3. hdu 5105

    题意: y=|a*x^3+b*x^2+c*x+d|    求y的最大值? 题目是bc上的,之前写的时候,没考虑0的情况(太笨了).... 水题吧.... AC代码: #include <iost ...

  4. MVC验证码的编写

    主要是相互学习一下mvc,希望各位大神指导 /// <summary> /// 生成随机数字 /// </summary> /// <returns>随机数字< ...

  5. token验证 sae

    在微信平台中修改服务器设置时,使用微信Demo的php,刚开始一直验证token 失败 解决办法 :在echo $echoStr;之前添加header('content-type:text');一句这 ...

  6. javascript时钟

    <script language="JavaScript" type="text/javascript">         function now ...

  7. js鼠标滑动图片显示隐藏效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. 网络请求时 返回 App Transport Security has blocked a cleartext HTTP

    如上图,是因为 Xcode7 没有对 plist 进行 http 请求的配置  所致 这时需要  加上上面的plist的红框中 的内容  并且 设置 为 yes  如下图

  9. 转:为什么需要htons(), ntohl(), ntohs(),htons() 函数

    为什么需要htons(), ntohl(), ntohs(),htons() 函数: 在C/C++写网络程序的时候,往往会遇到字节的网络顺序和主机顺序的问题.这是就可能用到htons(), ntohl ...

  10. 转:1.1 cdev_init cdev_alloc 使用说明

    对 “从globalmem学习linux字符设备驱动” 的 cdev_init 和 cdev_alloc中一些不清楚的地方进行说明:   cdev_init 和 cdev_alloc函数定义如下:   ...