gpt4 book ai didi

delphi - 了解 Rad Studio 中的 UTF8Encode 和 UTF8ToString

转载 作者:行者123 更新时间:2023-12-03 15:51:40 30 4
gpt4 key购买 nike

由于遗留原因,我需要在 Rad Studio 中使用使用 AnsiString 而不是 UnicodeString 的旧源。

所以,我的计划是大部分时间都使用 String,当我需要使用这个库时,转换为 AnsiString,同样,尽快从 AnsiString 转换为 String。

String temp = L"汉语/漢語";
AnsiString raw=UTF8Encode(temp);
String dest = UTF8ToString(raw);

当我检查时,我得到???而不是汉语/汉语。我做错了什么?

最佳答案

您需要避免在 Delphi/C++Builder 2009 及更高版本中使用 AnsiString 作为二进制缓冲区。它是一个代码页字符串,当字符串传递时,可能会导致从一个代码页到另一个代码页的微妙/意外的数据转换。在您的情况下, ??? 是数据实际转换为不支持您尝试使用的 Unicode 字符的 Ansi 代码页的直接结果。

您确实应该使用 TBytes 来存储二进制数据。对于 UTF-8 编码的字符串,请使用 UTF8String 代替:

String temp = L"汉语/漢語";
UTF8String raw = UTF8String(temp);
...
String dest = String(raw);

话虽如此,由于您必须与需要 UTF-8 编码的 AnsiString 作为二进制缓冲区1 的第三方库进行互操作,那么您至少可以使用 UTF8String 变量,并在将其传递到库时将其类型转换(而不是分配)为 AnsiString:

library_function(*(reinterpret_cast<AnsiString*>(&raw));

或者:

library_function(reinterpret_cast<AnsiString&>(raw));

这是有效的,因为 AnsiStringUTF8StringRawByteString 都基于相同的 AnsiStringT 基本类型:

typedef AnsiStringT<0> AnsiString;
typedef AnsiStringT<65001> UTF8String;
typedef AnsiStringT<65535> RawByteString;

因此,所有这些都在底层共享一个共同的内存布局和实现,Delphi 会很好地接受这一点。

如果您想真正具有冒险精神,您应该更新库以使用 RawByteStringUTF8String(如果不是 TBytes)而不是 AnsiString,那么您根本不需要类型转换2:

library_function(raw);

1:您确实需要获取该库的新版本,或使用不同的库。

2:这是 RawByteString 最初打算用于的情况。它从来没有打算用于独立变量,而是用于可以接受任何类型的 8 位字符串作为输入而不执行数据转换的函数参数。

关于delphi - 了解 Rad Studio 中的 UTF8Encode 和 UTF8ToString,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38180344/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com