none
[求助] 某些Unicode在vs2005中的(UTF-8)处理会出问题,在vs2017 中处理就是正常 RRS feed

  • 问题

  • 某些Unicode字符串:(我这里贴出来 发表就会出意外错误,所以就不贴出来了)

    𠀀𠀁𠀂𠀃𠀄𠀅𠀆𠀇𠀈𠀉𠀊𠀋𠀌𠀍𠀎𠀏𠀐𠀑𠀒𠀓𠀔𠀕𠀖𠀗𠀘𠀙𠀚𠀛𠀜𠀝𠀞𠀟𠀠𠀡𠀢𠀣(只是一部分类似的)

    将他们写入一个文本文件(UTF-8)。

    然后用C读取他们再写入另一个文件后。

    使用vs2005或vs2012编译出来的程序。其结果会出现不规则的乱码:

    但是使用vs2017编译出来的程序一切正常。

    想问一下,是不是vs2005处理某些特定的Unicode字符串会有问题?

    哪个范围的字符串会有问题?

    谢谢。

    下面是我的程序:

    int main(int  argc, char*  argv[])
    {
        FILE* fpRead = NULL;
        FILE* fpWrite = NULL;
        wchar_t szRead[1024] = {0};
        wchar_t szWrite[1024] = {0};

        fpRead = fopen("c:\\test\\read.txt","r,ccs=UTF-8");
        fpWrite = fopen("c:\\test\\write.txt","w,ccs=UTF-8");

        while(fgetws(szRead,sizeof(szRead),fpRead))
        {
            fputws(L"2\t",fpWrite);    // 这里如果只输出字符串则没问题,必须前面有其他字符串时才会出问题
            fputws(szRead,fpWrite);
        }

        fclose(fpRead);
        fclose(fpWrite);
     return 0; 
    }


    Langrisser



    2018年9月5日 9:39

答案

  • VS2017默认的编码方式是UTF-8,因此读取和写入UTF-8文件均正常,包括单字节、双字节、三字节或四字节字符。

    至于vs2005或vs2012编译出来是不规则的乱码,问题出在示例中的那些字符上,上述字符用UTF-8表示

    属于四字节字符,非普通的三字节字符,普通三字节字符能正常转换为UCS-2格式,即二字节Unicode字符。

    四字节UTF-8字符转换为UCS-2格式会出现不规则的乱码。

    因此在vs2005或vs2012中wchar_t类型使用三字节及以下字节的UTF-8字符比较合适。

    • 已标记为答案 Langrisser 2018年9月7日 9:11
    2018年9月7日 7:43

全部回复

  • 我查了一下,出问题的字符都是四字节的Unicode。

    VC我记得wchar_t处理的是UCS-2。

    是不是vc处理不了4字节的Unicode呢?

    那为什么VS2017又可以处理了?请问VS2017有这方面的改进么?


    Langrisser

    2018年9月6日 1:41
  • VS2017默认的编码方式是UTF-8,因此读取和写入UTF-8文件均正常,包括单字节、双字节、三字节或四字节字符。

    至于vs2005或vs2012编译出来是不规则的乱码,问题出在示例中的那些字符上,上述字符用UTF-8表示

    属于四字节字符,非普通的三字节字符,普通三字节字符能正常转换为UCS-2格式,即二字节Unicode字符。

    四字节UTF-8字符转换为UCS-2格式会出现不规则的乱码。

    因此在vs2005或vs2012中wchar_t类型使用三字节及以下字节的UTF-8字符比较合适。

    • 已标记为答案 Langrisser 2018年9月7日 9:11
    2018年9月7日 7:43
  • 在C++ 11 标准中为了可以处理4字节字符增加了char32_t类型。专门处理四字节字符。

    在vs2015之后才支持标准中char32_t类型。

    所以我猜想,vs2015之前处理四字节字符会出问题,之后应该就可以了。

    https://msdn.microsoft.com/zh-cn/library/hh567368(v=vs.140).aspx


    Langrisser

    2018年9月10日 9:49
  • 在C++ 11 标准中为了可以处理4字节字符增加了char32_t类型。专门处理四字节字符。

    在vs2015之后才支持标准中char32_t类型。

    所以我猜想,vs2015之前处理四字节字符会出问题,之后应该就可以了。

    https://msdn.microsoft.com/zh-cn/library/hh567368(v=vs.140).aspx


    Langrisser

         char32_t类型和wchar_t类型处理四字节和二字节字符,均需要开发人员对字符类型做事先判断,

         而UTF-8数据类型无论几个字节的字符,系统均能自动识别,无需人工干预,

         我认为VS2017版本将UTF-8改默认的编码方式更好。

    2018年9月11日 4:58