Visual c++ “的CString到UTF8转换失败”ý&引用;
在我的应用程序中,我想将包含字符ý的字符串转换为UTF-8。但它并没有给出确切的结果。 我使用的是WideCharToMultiByte函数,它将特定字符转换为ý 例如: 输入-“ý” 输出-“ý” 请看下面的代码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
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格式说明符。