5

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

char * dest;
UnicodeSring src;
UnicodeToUtf8(dest,256,src.w_str(),src.Length());

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

4

2 回答 2

10

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

UnicodeString src = ...;
UTF8String dest = src; // <-- automatic UTF16-to-UTF8 conversion
// use dest.c_str() and dest.Length() as needed...
于 2013-02-02T06:56:48.463 回答
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() );

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

char dest[256]; // room for 256 characters
UnicodeString src = L"Test this";
UnicodeToUtf8( dest, src, 256 );
于 2013-02-01T18:14:45.880 回答