【问题标题】:Problems converting std::wstring to UnicodeString using "UTF8ToUnicodeString"使用“UTF8ToUnicodeString”将 std::wstring 转换为 UnicodeString 的问题
【发布时间】:2021-11-10 10:35:12
【问题描述】:

在我的项目中(使用 Embarcadero C++Builder),我正在尝试使用来自 <system.hpp>UTF8ToUnicodeString()std::wstring 转换为 UnicodeString

结果显示一些俄语和越南语字符的替换字符 (U+FFFD)。但大多数字符都能正确显示。

有人知道问题出在哪里吗?是代码页的问题吗?

【问题讨论】:

  • "...将 UTF-8 编码的字符串转换为 Unicode 字符串..." - docwiki.embarcadero.com/Libraries/Sydney/en/… 奇怪的描述(因为 UTF-8 是 Unicode 编码)也不是你说你想做的。此外,您的 std::wstring 可能已经是 Unicode,只是采用 UTF-16le 编码(或 Linux 上的 UTF-32)。
  • 是的,std::wstring 应该已经是 Unicode。当我将它写入文件 (wofstream) 时,一切似乎都正常。但我想使用它的方法“SetText(const System::UnicodeString AText, const bool AFormulaChecking = false);”将 std::wstring 写入 Tdxspreadsheet 的单元格。但在这里,字符以 Ansi 编码显示。使用 UTF8ToUnicodeString 似乎可以转换,但存在所描述的问题。
  • 知道了。我从 std::wstring 切换到 std::string。我真的不明白为什么,但它现在可以工作了。
  • @geldo "我想使用它的方法“SetText(const System::UnicodeString AText, const bool AFormulaChecking = false);”将 std::wstring 写入 Tdxspreadsheet 的单元格中. 但是在这里,字符显示在 Ansi 编码中“ -​​ 那是由于您误用了UTF8ToUnicodeString()。您应该能够简单地使用SetText(wstring.c_str()) 而不会出现问题。 “使用 UTF8ToUnicodeString 似乎可以转换,但存在所描述的问题。” - 因为在这种情况下您根本不应该使用 UTF8ToUnicodeString()

标签: c++ delphi unicode encoding


【解决方案1】:

首先,std::wstringUnicodeString 都不使用 UTF-8,因此在这种情况下您根本不应该使用 UTF8ToUnicodeString()UnicodeString 在所有平台上都使用 UTF-16。 std::wstring 在 Windows 上使用 UTF-16,在大多数其他平台上使用 UTF-32。

其次,std::wstring 是一个基于wchar_t 的字符串。 UnicodeString 在 Windows 上使用 wchar_t,在其他平台上使用 char16_t。它的构造函数接受 C 风格的 wchar_t* 字符串指针作为输入,如果需要,会将数据转换为 UTF-16。

因此,您可以简单地使用std::wstring::c_str() 方法将std::wstring 转换为UnicodeString,例如:

std::wstring w = ...;
UnicodeString u = w.c_str();

或者:

std::wstring w = ...;
UnicodeString u(w.c_str(), w.size());

如果您尝试将wchar_t* 字符串分配给RawByteString,例如对于UTF8ToUnicodeString() 的输入,RTL 将执行Unicode->ANSI 转换为System::DefaultSystemCodePage 指定的默认系统ANSI 代码页,并非在所有平台上(尤其是在 Windows 上)都普遍设置为 UTF-8,因此您可能会丢失字符,甚至可能以 Mojibake 结尾。

【讨论】:

    猜你喜欢
    • 2011-01-03
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多