博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】CStdioFile UNICODE编译 英文系统下读取中文汉字乱码解决
阅读量:6220 次
发布时间:2019-06-21

本文共 1138 字,大约阅读时间需要 3 分钟。

  转载出处:

  函数原形为:char *setlocale( int category, const char *locale );

  头文件:<locale.h>
  所支持的操作系统为:ANSI, Win 95, Win NT
  对于简体中文可以使用如下设置:setlocale( LC_ALL, "chs" ); 
  为什么一定要调用setlocale呢?
  因为在C/C++语言标准中定义了其运行时的字符集环境为"C",也就是ASCII字符集的一个子集,那么mbstowcs在工作时会将cstr中所包含的字符串看作是ASCII编码的字符,而不认为是一个包含有chs编码的字符串,所以他会将每一个中文拆成2个ASCII编码进行转换,这样得到的结果就是会形成4个wchar_t的字符组成的串,那么如何才能够让mbstowcs正常工作呢?在调用mbstowcs进行转换之间必须明确的告诉mbstowcs目前cstr串中包含的是chs编码的字符串,通过setlocale( LC_ALL, "chs" )函数调用来完成,需要注意的是这个函数会改变整个应用程序的字符集编码方式,必须要通过重新调用setlocale( LC_ALL, "C" )函数来还原,这样就可以保证mbstowcs在转换时将cstr中的串看作是中文串,并且转换成为2个wchar_t字符,而不是4个。

  本地化设置需要具备三个条件:

  a. 语言代码 (Language Code)
  b. 国家代码 (Country Code) 
  c. 编码(Encoding)
  本地名字可以用下面这些部分来构造:
  语言代码_国家代码.编码 比如(zh_CN.UTF-8, en_US等)

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
CStdioFile file;
//设置语言为中文,否则在Unicode编码下读出中文字符为乱码 
char
* old_locale = _strdup( setlocale(LC_CTYPE, 
NULL
) ); 
setlocale( LC_CTYPE,
"chs"
);
//打开文件 
file.Open( strFilePath, CStdioFile::modeRead); 
//读取内容
CString str;
file.ReadString(str);
//关闭文件 
file.Close();
//还原语言区域的设置,还原区域设定
setlocale( LC_CTYPE, old_locale ); 
free( old_locale );

  注意:读取txt文件时,请修改txt文件编码为ANSI

你可能感兴趣的文章
JDBC的事务
查看>>
第五章(Web Service)
查看>>
有点坑爹的GDALComputeRasterMinMax函数
查看>>
微信裂变红包
查看>>
学习鸟哥的Linux私房菜笔记(3)——基础使用
查看>>
Linux性能测试 ps命令
查看>>
微信公众平台开发(48)星座运势
查看>>
linux和本地window文件传输
查看>>
团队冲刺第七天
查看>>
Jmeter 中JSON Path Extractor高级用法
查看>>
str_replace() 用法bug和技巧
查看>>
poi导出EXCEL
查看>>
Java GUI 的基础学习
查看>>
基于Python Tornado的在线问答系统
查看>>
java_jdbc_可滚动结果集与分页
查看>>
三国演义 ----感悟
查看>>
NTP时钟服务器助平安城市视频监控平台一臂之力
查看>>
机器学习中防止过拟合的处理方法
查看>>
Docker----与Asp.net core 的完美结合,在docker容器中创建Asp.Net Core 项目
查看>>
WP评论系统更换小结(转)
查看>>