2010-02-19 63 views
2

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

感谢,

克雷布斯

编辑:澄清:我猜我问的是.. CStringA似乎并不能够解释一个UTF8字符串为UTF8,而是作为ASCII或当前代码页(我认为)..我如何将此UTF8字符串转换为CStringW? (UTF-16 ..?)谢谢

回答

3

CStringW filename= CA2W(null_terminated_byte_buffer, CP_UTF8)应该这样做。

+0

谢谢我要试试这个.. – krebstar 2010-02-19 06:08:10

+0

这是否适用于非unicode应用程序?似乎没有工作.. = /我想我需要使用一个unicode版本的CFile以及..如何从非Unicode应用程序获得一个? – krebstar 2010-02-19 06:22:25

+0

请详细说明“似乎不起作用”。 – MSN 2010-02-19 06:27:01

0

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

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

0

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

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

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

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

+0

谢谢,我该怎么做..? – krebstar 2010-02-19 05:59:02

+0

在Windows上,您可以使用MultiByteToWideChar()和WideCharToMultiByte()。在任何平台上,您都可以使用mbstowcs()和wcstombs()以及其他相关函数。 前者提供更多的控制权,但后者是标准的C++,并可在任何平台上使用。 – 2010-02-24 07:02:38

0

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

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