在下面的例子中是否需要我使用wstring

时间:2010-03-16 09:34:46

标签: c++ unicode mfc

目前,我正在为中国客户开发应用程序。中国客户大多在其OS编码中切换到GB2312语言。我需要编写一个文本文件,使用GB2312进行编码。

  1. 我使用 std :: ofstream文件
  2. 我在MBCS模式下编译我的应用程序,而不是unicode。
  3. 我使用以下代码将 CString 转换为 std :: string ,并使用ofstream将其写入文件

  4. std::string Utils::ToString(CString& cString) {
        /* Will not work correctly, if we are compiled under unicode mode. */
        return (LPCTSTR)cString;
    }
    

    令我惊讶的是。它只是有效。我以为我至少需要使用wstring。我试着做一些调查。

    这是生成的MBCS.txt。

    alt text http://sites.google.com/site/yanchengcheok/Home/stackoverflow0.PNG

    1. 我尝试打印一个名为foot的单个字符(其值为0xBDC5)
    2. 当我使用CString携带此字符时,其长度为2。
    3. 当我使用Utils :: ToString执行到std :: string的转换时,返回的字符串长度为2.
    4. 我使用std :: ofstream
    5. 写入文件

      我的问题是:

      1. 当我使用十六进制编辑器检查MBCS.txt时,该值显示为BD(LSB)和C5(MSB)。但我正在使用小端机。是不是十六进制编辑器应该显示C5(LSB)和BD(MSB)?我从维基百科检查。 GB2312似乎没有具体的字节顺序。
      2. 似乎使用std :: string + CString对我的情况很好。我可以知道在什么情况下,上述方法不起作用?什么时候我应该开始使用wstring?

1 个答案:

答案 0 :(得分:0)

关于1.当您按照较小的单位序列化单位时,字节顺序是您遇到的问题(即按照八位字节序列化单位)。我远不是CJK编码的专家,但在我看来,GB2112是一个编码字符集,可以与几种编码方案一起使用。维基百科页面中引用的用于GB2112(ISO 2022,EUC-CN和HZ)的编码方案都是以八位字节的形式定义的。如果序列化为八位字节,则没有字节序问题。

将此与Unicode编码方案进行对比:UTF-8是根据八位字节定义的,并且在序列化为八位字节时没有字节序问题,UTF-16是根据seizets定义的,如果序列化为八位字节,则必须指定字节序,UTF- 32是按32位单位定义的,如果序列化为八位字节,则必须指定字节顺序。

相关问题