gpt4 book ai didi

c++ - 将 "normal"std::string 转换为 utf-8

转载 作者:IT老高 更新时间:2023-10-28 21:45:22 25 4
gpt4 key购买 nike

让我们看看我是否可以在没有太多事实错误的情况下解释这一点......

我正在编写一个字符串类,我希望它使用 utf-8 (存储在 std::string 中)因为它是内部存储。我希望它能够同时“正常”std::stringstd::wstring作为输入和输出。

使用 std::wstring 没问题,我可以使用 std::codecvt_utf8<wchar_t>从和转换为 std::wstring。

但是,在对 SO 进行广泛的谷歌搜索和搜索之后,我还没有找到一种在“正常/默认”C++ std::string (我假设在 Windows 中使用本地系统本地化?)和 utf- 之间转换的方法8 标准::字符串。

我想一个选择是首先使用 std::codecvt<wchar_t, char> 将 std::string 转换为 std::wstring然后如上所述将其转换为 utf-8,但这似乎非常低效,因为如果我理解正确,至少一个 char 的前 128 个值应直接转换为 utf-8 而无需转换,无论本地化如何。

我发现了这个类似的问题:C++: how to convert ASCII or ANSI to UTF8 and stores in std::string虽然我对这个答案有点怀疑,因为它被硬编码为 latin 1,我希望它能够与所有类型的本地化一起使用,以确保安全。

没有涉及提升的答案谢谢,我不想让我的代码库使用它而头疼。

最佳答案

如果您的“普通字符串”是使用系统的代码页编码的,并且您想将其转换为 UTF-8,那么这应该可以:

std::string codepage_str;
int size = MultiByteToWideChar(CP_ACP, MB_COMPOSITE, codepage_str.c_str(),
codepage_str.length(), nullptr, 0);
std::wstring utf16_str(size, '\0');
MultiByteToWideChar(CP_ACP, MB_COMPOSITE, codepage_str.c_str(),
codepage_str.length(), &utf16_str[0], size);

int utf8_size = WideCharToMultiByte(CP_UTF8, 0, utf16_str.c_str(),
utf16_str.length(), nullptr, 0,
nullptr, nullptr);
std::string utf8_str(utf8_size, '\0');
WideCharToMultiByte(CP_UTF8, 0, utf16_str.c_str(),
utf16_str.length(), &utf8_str[0], utf8_size,
nullptr, nullptr);

关于c++ - 将 "normal"std::string 转换为 utf-8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21575310/

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