none
wifstream和wstring无法正确的处理utf8文件 RRS feed

  • 问题

  • rt,我希望使用wifstream和wstring配合来处理utf-8编码的文件,但是发现读取文件后,wstring里面将本应占3个字节的中文全部分割成2个字节去存储了,导致无法正确的使用length()判断字符个数,也无法通过下标获得相应的字符。

    代码如下:

    locale lang("chs");
    wstring line;
    wifstream in("utf8");
    in.imbue(lang);
    wcout.imbue(lang);
    
    getline(in, line);
    
    wcout << line.length() << endl
    	<< line << endl;
    
    for (int i = 0; i < line.length(); i++)
    {
    	cout <<line[i] << "\t";
    }


    同样的程序拿到linux下可以完美运行(lang已修改为linux 版本)

    请问有什么方法可以解决我遇到的问题吗

    2011年9月20日 13:47

答案

  • 你好,

     

    UTF-88-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码。UTF-8使用一至四个字节为每个字符编码。因此您无法从UNICODE字符数判断出UTF-8文本的字节数。 我建议您可以使用WideCharToMultiByte / MultiByteToWideChar 先转换编码格式。  

     


    Rob Pan [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 Rob Pan 2011年9月29日 8:15
    2011年9月22日 7:45
  • 你好,

     

    这是由于不同的系统对于编码格式处理的方式不同造成的。在Windows 系统中,为了节省空间,所以在解析UTF-8的编码格式时,采用了变长的解析方式。


    Rob Pan [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 Rob Pan 2011年9月29日 8:15
    2011年9月26日 8:00

全部回复

  • 你好,

     

    UTF-88-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码。UTF-8使用一至四个字节为每个字符编码。因此您无法从UNICODE字符数判断出UTF-8文本的字节数。 我建议您可以使用WideCharToMultiByte / MultiByteToWideChar 先转换编码格式。  

     


    Rob Pan [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 Rob Pan 2011年9月29日 8:15
    2011年9月22日 7:45
  • 但事实上,这段程序在linux下运行很正常
    2011年9月22日 11:07
  • 你好,

     

    这是由于不同的系统对于编码格式处理的方式不同造成的。在Windows 系统中,为了节省空间,所以在解析UTF-8的编码格式时,采用了变长的解析方式。


    Rob Pan [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 Rob Pan 2011年9月29日 8:15
    2011年9月26日 8:00