我尝试在C ++构建器中将UnicodeString转换为UTF-8编码的字符串。我使用UnicodeToUtf8()函数来做到这一点。
char * dest;
UnicodeSring src;
UnicodeToUtf8(dest,256,src.w_str(),src.Length());
但编译器显示我的运行时访问冲突消息。我做错了什么?
答案 0 :(得分:8)
假设您正在使用C ++ Builder 2009或更高版本(您没有说),并且正在使用RTL的System::UnicodeString
类(而不是其他第三方UnicodeString
类),那么处理这种情况是一种更简单的方法。 C ++ Builder还有一个System::UTF8String
类可用(它自C ++ Builder 6开始提供,但在C ++ Builder 2009之前没有成为真正的RTL实现的UTF-8字符串类型)。只需将UnicodeString
分配给UTF8String
,让RTL为您处理内存分配和数据转换,例如:
UnicodeString src = ...;
UTF8String dest = src; // <-- automatic UTF16-to-UTF8 conversion
// use dest.c_str() and dest.Length() as needed...
答案 1 :(得分:3)
这解决了问题中的问题,但是执行UTF16到UTF8转换的真正方法是在下面的Remy的答案中。
dest是指向内存中随机空间的指针,因为您没有初始化它。在调试版本中它可能指向0但在发布版本中它可能在任何地方。你告诉UnicodeToUtf8 dest是一个缓冲区,空间为256个字符。
试试这个
char dest[256]; // room for 256 characters
UnicodeString src = L"Test this";
UnicodeToUtf8( dest, 256, src, src.Length() );
但实际上你可以更轻松地使用:
char dest[256]; // room for 256 characters
UnicodeString src = L"Test this";
UnicodeToUtf8( dest, src, 256 );