先放结果

         setlocale(LC_ALL, "");
rapidxml::file<> f(szPath);
setlocale(LC_ALL, "C");

对于setlocale函数,一下是msdn的说法

char *setlocale(
int category,
const char *locale
);

参数

category
受区域设置影响的分类。

locale
区域设置说明符。

返回值

Return value
 

如果提供了有效的 locale 和 category,则返回指向与指定的 locale 和 category 关联的字符串的指针。 如果 locale 或 category 无效,则返回空指针,并且不更改程序的当前区域设置。

例如,调用

setlocale( LC_ALL, "en-US" );

设置所有类别,只返回该字符串

en-US

你可以复制由 setlocale 返回的字符串以还原程序的区域设置信息的该部分。 全局或线程本地存储用于由 setlocale 返回的字符串。 稍后调用setlocale 将覆盖字符串,这将使之前调用返回的字符串指针无效。

如果 locale 指向一个空字符串,即

setlocale(LC_ALL, ""); 

则区域设置是实现定义的本机环境。 C 的值为 C 转换指定最小的符合 ANSI 标准的环境。 C 区域设置假设所有 char 数据类型为 1 字节,并且其值始终小于 256。

为什么一定要调用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个。 经过转换后的路径当然在实际并不存在,因为这个原因才导致的rapidxml跑出了一个RUNTIME ERROR

记得调用

setlocale(LC_ALL, ""); 后要在合适的地方通过setlocale( LC_ALL, "C" )转换回原本字符集,不然可能会导致其他错误

最新文章

  1. window.frameElement的使用
  2. thinkphp3.2跨控制器调用其他模块的方法
  3. matlab 快捷键
  4. 【环境配置】Linux环境下下载、配置java环境、安装eclipse、建立eclipse快捷方式详解
  5. discuz模板文件列表
  6. 腾讯云centos 7部署 dotnetcore+Angular2 实践
  7. jquery之val()和attr(&quot;value&quot;)
  8. Python——str(字符串)内部功能介绍
  9. bzoj1070————2016——3——14
  10. Verilog HDL程序设计——基本要素
  11. JavaScript ES6中export及export default的区别
  12. A、B同时打开一个页面进行同一条数据库记录进行修改,A修改完成后提交表单,A修改的数据保存完成后;当B也修改完成后,提交数据进行数据修改。此时B修改的内容会覆盖A修改的内容,请问如何避免?
  13. System.data.sqlclient.sqlexception:将截断字符串或二进制数据终止
  14. IDEA搭建基于maven的springboot工程
  15. idea添加JPA导出实体类
  16. 28. SpringBoot 集成Redis
  17. poj3207 Ikki&#39;s Story IV - Panda&#39;s Trick 2-SAT
  18. JS对字符串编码的几种方式
  19. Golang的第一个程序-Hello, World !
  20. nginx 设置错误的自己定义404页面跳转到500

热门文章

  1. PIE SDK图像旋转
  2. Yii2 hasMany 关联后加条件
  3. oracle12C--新特性
  4. nodejs(二) --- 重要知识点回顾
  5. pulic——function(下载的公共的)
  6. 3、java内存模型特点
  7. C# 批量生成随机密码,必须包含数字和字母,并用加密算法加密
  8. js 中标签的增删 方法
  9. tornado handler 方法复用的 3 个方法
  10. Java学习第二十四天