2011-10-25 41 views
1

美好的一天, 我一直在使用Windows API编写一个简单的程序,它使用C++/CLI编写。 我遇到的问题是,我正在加载一个库(.dll),然后调用它的函数。其中一个函数返回char *。所以我返回值添加到我的文本框现在C++/CLI更改编码

output->Text = System::Runtime::InteropServices::Marshal::PtrToStringAnsi 
        (IntPtr(Function())); 

,你可以看到这个被编码为ANSI,*返回的char是,我想,也ANSI(或Windows 1252,W/E你们称它:>)。原始数据,LIBRARY中的函数以UTF-8编码,可变长度字节字段,终止0x00。我的程序中有很多非拉丁字符,所以这很麻烦。我也试过这个

USES_CONVERSION; 
wchar_t* pUnicodeString = 0; 
pUnicodeString = A2W(Function()); 

output->Text = System::Runtime::InteropServices::Marshal::PtrToStringUni 
        (IntPtr(pUnicodeString)); 

使用atlconv.h。它仍然打印格式错误/错误的字符。所以我的问题是,我可以将它转换为UTF-8之类的东西,这样我就可以看到正确的输出,或者char *是否释放了所需的必要信息?也许更改.dll源代码会有所帮助,但是它很古老,并且用C语言编写,所以我不想惹它:/ 我希望我提供的信息是足够的,如果您还需要更多,只需询问。

+1

你是第二个片段有更多的希望。不过你必须把pUnicodeString传递给PtrTostringUni()。 –

+0

我忘了:你不能使用A2W(),它不会做utf-8解码。改用MultiByteToWideChar()。 –

回答

1

据我所知,没有标准的方式来处理UTF-8。尝试Google适当的转换器,例如http://www.nuclex.org/articles/cxx/10-marshaling-strings-in-cxx-cliConvert from C++/CLI pointer to native C++ pointer

此外,你的第二个代码片段不使用pUnicodeString,它看起来不正确。

+0

对不起,我错误输入了第二个代码,它应该是output-> Text = System :: Runtime :: InteropServices :: Marshal :: PtrToStringUni(IntPtr(pUnicodeString));事实并没有改变,但它不工作:((我已经修复了原始帖子。) – Zylius

+0

您是否尝试过'System :: Text :: Encoding :: UTF8-> GetString(bytes)'? – kan

+0

如何使用System :: Text :: Encoding :: UTF8-> GetString(bytes)char *? – Zylius