字节数组为UTF8 CString

时间:2010-02-19 05:41:32

标签: c++ visual-c++ utf-8 string

我正在使用Visual Studio 2008(C ++)。如何从具有以UTF8编码的字符串的字节数组创建CString(在非Unicode应用程序中)?

谢谢,

的Kreb

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

4 个答案:

答案 0 :(得分:3)

CStringW filename= CA2W(null_terminated_byte_buffer, CP_UTF8)应该可以解决问题。

答案 1 :(得分:0)

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

请注意,除非CString知道UTF8语义(我不熟悉CString以确切知道它是如何工作的,但我怀疑不是),某些对ASCII C字符串有意义的操作可能会产生奇怪的结果对于UTF8 C字符串。例如,一个颠倒字符串中字节顺序的Reverse()方法对UTF8字符串不起作用,因为它不知道将多字节字符保持在原始顺序中,并且会反转多字节字符的字节。

答案 2 :(得分:0)

对于大多数情况,您可以将UTF8视为与ASCII相同。

unsigned char szUtf8String[nSize] = "whatever";
CString s = static_cast<char *>(szUtf8String);

适用于操作和写入文件。 但是,您无法轻松显示该字符串,它会将其视为ASCII并错误解释任何非英语字符。

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

答案 3 :(得分:0)

按照上面的“MSN”回答,我认为你最终会想要一个CString,而不是CStringW。所以将转换添加回CString:

CStringW filenameW = CA2W(null_terminated_byte_buffer,CP_UTF8); CString filename = CW2T(filenameW);