我不明白为什么我的 std::string 字符串没有正确包含 UTF-8 字符串

问题描述 投票:0回答:1

大家!我正在编辑我的问题,以便通过代码向每个人提供有关我的问题的更清晰的信息。我还将我的输入字符串从日语更改为希腊字符串,请注意。非常感谢!

所以,就在这里。 我在下面有这个 wstring 输入:

wstring command = L"Σὲ γνωρίζω ἀπὸ τὴν κόψη";

这是将 std::wstring 转换为 std::string 的现有代码(注意:我没有创建此代码)。

string wstring2string(const wstring& str) 
{
   string str2(str.length(), L' ');
   std::copy(str.begin(), str.end(), str2.begin());
   return str2;
}

这个函数之后,字符串中的值变成了这样。 Debugged string values here.

£r ³½ÉÁw¶É 

此功能适用于非 UTF-8 和非 Unicode 文本。我只是无法理解为什么它也不能使用 UTF-8 文本。非常感谢大家!

c++ string encoding utf-8 wstring
1个回答
1
投票

这是将 std::wstring 转换为 std::string 的现有代码(注意:我没有创建此代码)。

函数只是将原始字符串中的每个代码单元复制到输出字符串中,根据

wchar_t
char
的整数属性隐式转换代码单元的数值。实际上,这意味着所有代码单元都被简单地截断为其最低字节,从而丢失所有其他信息。该函数不考虑任何编码或任何东西。它完全坏了。

要从

std::wstring
转换为
std::string
你应该首先知道输入和输出是如何编码的(例如系统的宽和窄执行字符集编码)然后你应该使用一个 unicode 库提供这两个之间的转码编码。

C++ 标准库确实有它的函数 (https://en.cppreference.com/w/cpp/locale/wstring_convert),但由于安全和规范问题,它们已被弃用,因此不应使用或使用仔细

如果你想从原生的宽字符集编码转换为当前C语言环境的窄多字节编码,你也可以使用https://en.cppreference.com/w/cpp/string/multibyte/wcsrtombs,但是随后您还必须小心确保设置了正确的语言环境。

一个非常完整的 unicode 解决方案是 ICU,但是对于你在这里问的,你只需要它的一小部分。

在 POSIX 系统上有

iconv
.

您也可以找到第三方库。

© www.soinside.com 2019 - 2024. All rights reserved.