转载出处:http://www.cnblogs.com/ct0421/p/3242418.html

  函数原形为: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。

【转】CStdioFile UNICODE编译 英文系统下读取中文汉字乱码解决的更多相关文章

  1. ubuntu 英文系统下安装中文输入法

    环境:ubuntu15.10 64位 英文版 软件:fcitx输入法框架,及多种拼音输入法 linux的英文系统会比中文少很多麻烦,特别是在命令行输入路径的时候,如果路径是中文将是一件很头疼的问题.但 ...

  2. linux 下vi /vim 中文汉字乱码解决

    http://my.oschina.net/laserdance/blog/53474很多win下编译的配置文件(译码格式有utf8/gbk)上传到linux服务器上时打开汉字乱码 解决方法如下: 修 ...

  3. CStdioFile UNICODE编译 读取中文汉字乱码 .

    函数原形为:char *setlocale( int category, const char *locale );头文件:<locale.h>所支持的操作系统为:ANSI, Win 95 ...

  4. 【转】Ubuntu英文系统下安装中文输入法

    转自:https://my.oschina.net/No5stranger/blog/290026 ubuntu默认的输入法是ibus,综合网上评论,fcitx的支持者更多,而且个人感觉fcitx也的 ...

  5. Ubuntu18.04 英文系统下安装中文输入法

    今天尝试了Ubuntu18.04LTS(依旧装的英文版)发现按照之前的方法( http://www.cnblogs.com/asmer-stone/p/5227188.html)安装中文输入法不行了, ...

  6. 在ubuntu英文系统下使用中文输入法

    How to install and use Chinese Input Method in the English Locale in Ubuntu ?(1) Check if there exis ...

  7. ubuntu14.04英文环境下安装中文输入法

    ubuntu14.04英文环境下安装中文输入法 发表于1年前(2014-07-12 20:12)   阅读(4478) | 评论(0) 3人收藏此文章, 我要收藏 赞1 9月19日成都 OSC 源创会 ...

  8. CentOS7英文环境下使用中文输入法

    一般我们使用英文环境是没有办法使用中文的,这是因为我们没有设置在英文环境下的中文配置,下面我们在英文环境下配置中文输入法ibus使得我们可以输入中文. 首先,安装ibus(centos6以后已经默认安 ...

  9. ubuntu系统下matplotlib中文乱码问题

    参考 [ubuntu系统下matplotlib中文乱码问题 - CSDN博客](https://blog.csdn.net/jeff_liu_sky_/article/details/54023745 ...

随机推荐

  1. 应用LR监控Apache性能

    1)对Apache服务器中的http.conf进行如下配置修改Apache中Httpd.conf文件,添加如下代码(该文件中都有,只要取消注释就好了)<Location /server-stat ...

  2. 哪种代理适合用于Web数据采集

    在Web数据采集中为了避免被服务器封锁而通过代理下载的情况很常见.但是,并非所有的代理都适合于Web数据采集.下面是鲲鹏数据的技术人员给出的说明. 根据HTTP代理的匿名性可以将其分为以下几种:   ...

  3. R快速创建个文件

    cat("TITLE extra line", "2 3 5 7", "11 13 17", file="ex.data" ...

  4. jedis连接集群

    /**        * 集群版        */       @Test       public  void JedisJiuQun()       {           HashSet< ...

  5. 利用 meta 标签重定向

      页面定期刷新,如果加url的,则会重新定向到指定的网页,content后面跟的是时间(单位秒),把这句话加到指定网页的<head></head>里一般也用在实时性很强的应用 ...

  6. mongodb - save()和insert()的区别

    遇到_id相同的情况下:insert操作会报错:save完成保存操作 > db.person.find() > db.person.insert({"_id":1,ag ...

  7. .NET面试题(二)

    基础方面: 1.简单的描述一下C# 中重写,重载,隐藏的概念 C#中重写(overide)是子类继承父类后,对父类中的方法进行行为改写. 重载是指方法名相同,参数不同 重写和隐藏的定义: 重写:基类方 ...

  8. Nodejs 命令行交互神奇 yargs

    传送门: # example https://github.com/yargs/yargs/blob/master/docs/examples.md # 官网 http://yargs.js.org/ ...

  9. signed distance field 算法

    将二值图转化成signed distance field后,可以在双线性插值下实现平滑放大. 定义: 到前景的distance field:各点到最近前景点的距离. 到背景的distance fiel ...

  10. NGUI ScrollView中MoveRelative,Scroll的区别

    Scroll会计算边界,和直接拖拽的效果类似 MoveRelative不计算边界,超出边界了也不会管,也不会应用缓动效果