C++ 字节数组到UTF8字符串

C++ 字节数组到UTF8字符串,c++,visual-c++,utf-8,string,C++,Visual C++,Utf 8,String,我正在使用VisualStudio2008(C++)。如何从包含UTF8编码字符串的字节数组中创建CString(在非Unicode应用程序中) 谢谢 克雷布 编辑:澄清:我想我要问的是。。CStringA似乎无法将UTF8字符串解释为UTF8,而是将其解释为ASCII或当前代码页(我认为)。。如何将此UTF8字符串转换为CStringW?(UTF-16..)谢谢UTF8的优点是,每个UTF8字符串也是一个有效的以NUL结尾的C字符串。这意味着您应该能够简单地将指向字节数组第一个字符的指针转换为

我正在使用VisualStudio2008(C++)。如何从包含UTF8编码字符串的字节数组中创建CString(在非Unicode应用程序中)

谢谢

克雷布


编辑:澄清:我想我要问的是。。CStringA似乎无法将UTF8字符串解释为UTF8,而是将其解释为ASCII或当前代码页(我认为)。。如何将此UTF8字符串转换为CStringW?(UTF-16..)谢谢

UTF8的优点是,每个UTF8字符串也是一个有效的以NUL结尾的C字符串。这意味着您应该能够简单地将指向字节数组第一个字符的指针转换为(const char*)并将其传递给CString,就像任何以NUL结尾的C字符串一样


注意,除非CString知道UTF8语义(我对CString不太熟悉,不知道它是如何工作的,但我怀疑不是),否则对ASCII C字符串有意义的某些操作可能会给UTF8 C字符串带来奇怪的结果。例如,反转字符串中字节顺序的Reverse()方法对UTF8字符串不起作用,因为它不知道如何将多字节字符按原始顺序放在一起,并且会反转多字节字符的字节。

对于大多数情况,可以将UTF8视为ASCII

unsigned char szUtf8String[nSize] = "whatever";
CString s = static_cast<char *>(szUtf8String);
无符号字符szUtf8String[nSize]=“任意”;
CString s=静态_转换(szUtf8String);
用于操纵和写入文件的。 但是,您无法轻松显示该字符串,它会将其视为ASCII并错误解释任何非英语字符


要显示它,您需要转换为UTF16,然后可能再转换回ANSI(在本地代码页中)

CStringW filename=CA2W(以null结尾的字节缓冲区,CP\u UTF8)
应该可以做到这一点。

根据上面的“MSN”答案,我认为您最终会想要一个CString,而不是一个CStringW。因此,将转换添加回CString:

CStringW filenameW=CA2W(空字节缓冲区,CP\u UTF8);
CString filename=CW2T(filenameW)

这在非unicode应用程序中有效吗?似乎不起作用我想我还需要使用一个unicode版本的CFile。。如何从非Unicode应用程序中获取一个?抱歉,我这样做了,调试器中的CString仍然显示它,就好像它是用本地代码页解释的一样,也就是说,没有更改。无论如何,我试图打开一个文件名为CStringW的文件(CFile),但它仍然是本地代码页中解释的字符串=/我认为它是这样失败的,因为我正在用CW2A(文件名)打开文件。。从而将其转换回UTF8。。有没有一种方法可以只使用这些函数的unicode版本而不必移植整个应用程序?快速提问。。如果我有一个类似“CStringW filename=L”的语句中文“;”我可以将鼠标悬停在filename变量上,它会正确显示文本。。。但是,如果我执行“CStringW filename=CA2W((LPCTSTR)buffer,CP_UTF8);”并将鼠标悬停在filename和buffer变量上,它们会显示错误解释的文本。。发生了什么事?好像CA2W什么都没做。。这是否意味着我的缓冲区不是UTF8格式的?当然有可能。字节数组是什么(最好是十六进制)?您可能还应该强制转换为LPCSTR,因为CA2W代表ANSI到Unicode。在Windows上,您可以使用MultiByteToWideChar()和WideCharToMultiByte()。在任何平台上,都可以使用mbstowcs()和wcstombs()以及其他相关函数。前者提供更多的控制,后者是标准的C++,在任何平台上都可用。