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