“ý”的CString转UTF8转换失败

时间:2014-12-19 13:09:33

标签: visual-c++ mfc cstring

在我的应用程序中,我想将包含字符ý的字符串转换为UTF-8。但它没有给出确切的结果。 我正在使用WideCharToMultiByte函数,它将特殊字符转换为ý。

例如: 输入 - “ý” 输出 - “ý”

请参阅以下代码..

String strBuffer("ý" );
char *utf8Buffer = (char*)malloc(strBuffer.GetLength()+1);
int utf8bufferLength = WideCharToMultiByte(CP_UTF8, 0, (LPCWSTR)strBuffer.GetBuffer(strBuffer.GetLength() + 1)),
 strBuffer.GetLength(), utf8Buffer, strBuffer.GetLength() * 4,0,0);

请提出你的建议......

  • Binoy Krishna

2 个答案:

答案 0 :(得分:0)

字母 ý的Unicode代码点,根据this page是253 10 或FD 16 。 UTF-8表示为195 189十进制或C3 BD十六进制。在程序和/或调试器中,这两个字节可以看作字母 ý,但它们是UTF-8编号,所以它们是< em> bytes ,而不是字母

换句话说,输出和代码都很好,你的期望是错误的。我不能说为什么他们错了,因为你没有提到你到底想要什么。

编辑:应该改进代码。有关更多信息,请参阅Rudolfs的回答。

答案 1 :(得分:0)

在我写这篇文章时,我们已经发布了一个解释您所看到的字符值的答案,但是,有两件事要提及您的代码:

1)初始化字符串时应使用_T()宏:CString strBuffer(_T("ý")); _T()宏在tchar.h中定义并映射到正确的字符串类型,具体取决于_UNICODE宏的值。

2)不要使用GetLength()来计算UTF-8缓冲区的大小,请参阅MSDN中WideCharToMultiByte的文档,它显示了如何使用该函数计算所需的长度注释部分中的UTF-8缓冲区。

这是一个根据代码点验证输出的小例子,并演示了如何使用自动长度计算:

#define _AFXDLL
#include <afx.h>

#include <iostream>

int main(int argc, char** argv)
{
    CString wideStrBuffer(_T("ý"));
    // The length calculation assumes wideStrBuffer is zero terminated
    CStringA utf8Buffer('\0', WideCharToMultiByte(CP_UTF8, 0, wideStrBuffer.GetBuffer(), -1, NULL, 0, NULL, NULL));
    WideCharToMultiByte(CP_UTF8, 0, wideStrBuffer.GetBuffer(), -1, utf8Buffer.GetBuffer(), utf8Buffer.GetLength(), NULL, NULL);
    if (static_cast<unsigned char>(utf8Buffer[0]) == 195 && static_cast<unsigned char>(utf8Buffer[1]) == 189)
    {
        std::cout << "Conversion successful!" << std::endl;
    }
    return 0;
}