C++ builder - 将UnicodeString转换为UTF-8编码的字符串

Par*_*ore 5 c++builder utf-8

我尝试在C++构建器中将UnicodeString转换为UTF-8编码的字符串.我使用UnicodeToUtf8()函数来做到这一点.

char * dest;
UnicodeSring src;
UnicodeToUtf8(dest,256,src.w_str(),src.Length());
Run Code Online (Sandbox Code Playgroud)

但编译器显示我的运行时访问冲突消息.我做错了什么?

Rem*_*eau 10

假设您正在使用C++ Builder 2009或更高版本(您没有说),并且正在使用RTL的System::UnicodeString类(而不是其他第三方UnicodeString类),那么有一种更简单的方法来处理这种情况.C++ Builder也有一个System::UTF8String类可用(它自C++ Builder 6开始提供,但在C++ Builder 2009之前没有成为真正的RTL实现的UTF-8字符串类型).只需将您分配UnicodeString给a UTF8String,让RTL为您处理内存分配和数据转换,例如:

UnicodeString src = ...;
UTF8String dest = src; // <-- automatic UTF16-to-UTF8 conversion
// use dest.c_str() and dest.Length() as needed...
Run Code Online (Sandbox Code Playgroud)


Gre*_*ndt 4

这解决了问题中的问题,但进行 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() );
Run Code Online (Sandbox Code Playgroud)

但实际上你可以使用更简单的方法:

char dest[256]; // room for 256 characters
UnicodeString src = L"Test this";
UnicodeToUtf8( dest, src, 256 );
Run Code Online (Sandbox Code Playgroud)