Visual c++ “的CString到UTF8转换失败”ý&引用;

Visual c++ “的CString到UTF8转换失败”ý&引用;,visual-c++,mfc,cstring,Visual C++,Mfc,Cstring,在我的应用程序中,我想将包含字符ý的字符串转换为UTF-8。但它并没有给出确切的结果。 我使用的是WideCharToMultiByte函数,它将特定字符转换为ý 例如: 输入-“ý” 输出-“ý” 请看下面的代码 String strBuffer("ý" ); char *utf8Buffer = (char*)malloc(strBuffer.GetLength()+1); int utf8bufferLength = WideCharToMultiByte(CP_UTF8, 0, (L

在我的应用程序中,我想将包含字符ý的字符串转换为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);
请给出你的建议

  • 比诺克里希纳
  • 根据is 25310或FD16,字母的Unicode码点。UTF-8表示为195 189十进制或C3 BD十六进制。在您的程序和/或调试器中,这两个字节可以被视为字母,但它们是UTF-8数字,因此它们是字节,而不是字母

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


    编辑:代码应该得到改进。有关更多信息,请参阅鲁道夫的答案。

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

    1) 初始化字符串时应使用
    \u T()
    宏:
    CString strBuffer(\u T(“ý”)
    宏在
    tchar.h
    中定义,并根据
    \u UNICODE
    宏的值映射到正确的字符串类型

    2) 不要使用
    GetLength()
    计算UTF-8缓冲区的大小,请参阅MSDN中的文档,它在注释部分显示了如何使用函数计算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;
    }
    
    \define\u afxdl
    #包括
    #包括
    int main(int argc,字符**argv)
    {
    CString宽缓冲区(ýT(“ý”);
    //长度计算假定WidtrBuffer以零结尾
    CStringA utf8Buffer('\0',WideCharToMultiByte(CP_UTF8,0,widetrbuffer.GetBuffer(),-1,NULL,0,NULL,NULL));
    WideChartMultiByte(CP_UTF8,0,WideTrbuffer.GetBuffer(),-1,utf8Buffer.GetBuffer(),utf8Buffer.GetLength(),NULL,NULL);
    if(static_cast(utf8Buffer[0])==195&&static_cast(utf8Buffer[1])==189)
    {
    
    祝贺你,它可以工作了。调试器不知道你的字符*包含utf8编码的文本,你必须让它知道。使用s8格式说明符。