VS2005中的中文编码问题两则

四月 27th, 2010 发表评论 阅读评论

      由于VS2005比VC6.0提供了更为复杂的Unicode和多字节字符集支持,因此在一些时候可能出现字符集不匹配的情况。

  • 第一个问题是在使用C++中的ifsteam和ofstram打开含有中文的路径的时候无法正常打开。网上提供的解决方法大致有三种:

      1. 将项目属性->字符集设置为使用Unicode字符集,并在所有字符串外面面加上_T() 或者_TEXT宏,代价是原来所有不符合unicode规范的地方都必须得改。

      2. 不更改项目属性->字符集,并在程序初始化的时候调用C语言中的函数setlocale()设置中文运行环境如下:

      setlocale(LC_ALL,"Chinese-simplified");

      3. 不更改项目属性->字符集,使用STL函数设置系统语言环境

      std::locale::global(std::locale(""));

      最后一种方法是C++中比较常用的,但是后两种方法在打开文件后要将运行环境还原,否则在cout的时候就不能输出中文了。

Sample Code:

 /***********************************************************************/
 /* 方法1,使用_TEXT()宏定义将字符串常量指定为TCHAR*类型,须是unicode下编译     */
 /***********************************************************************/
 fstream file;
 file.open(_TEXT("c:\\测试\\测试文本.txt"));
 cout<<file.rdbuf();
 file.close();
 /***************************************************************/
 /* 方法2,使用C函数setlocale                                     */
 /* 使用该方法以后,cout可能不能正常输出中文,十分蹊跷                 */
 /* 我发现了勉强解决的方法:不要在还原区域设定前用cout或wcout 输出中文  */
 /* 否则后果就是还原区域设定后无法使用cout wcout输出中文              */
 /***************************************************************/
 setlocale(LC_ALL,"Chinese-simplified");//设置中文环境
 file.open("c:\\测试\\测试文本3.txt");//可以顺利打开文件了
 setlocale(LC_ALL,"C");//还原
 cout<<file.rdbuf();
 file.close();
 /****************************************************************/
 /* 方法3,使用STL中的locale类的静态方法指定全局locale                */
 /* 不能用cout输出中文的问题解决方法同上                              */
 /****************************************************************/
 locale::global(locale(""));//将全局区域设为操作系统默认区域
 file.open("c:\\测试\\测试文本2.txt");//可以顺利打开文件了
 locale::global(locale("C"));//还原全局区域设定
 cout<<file.rdbuf();
 file.close();
  • 第二个问题是在调试程序的时候,源代码中的某些断点会被自动禁用,怎么也中断不了。鼠标放上去的时候会提示,源代码与原始版本不同,无法命中该断点。这种情况很可能就是源代码的文件的编码格式不是Unicode格式,需要进行编码转换。

      解决方法:在VS2005菜单的文件->高级保存选项里面将当前源代码文件的编码设置成Unicode,并重新编译生成。

眨眼

分类: 标签: VS2005 中文编码