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

 phpxiaohui 发布于 2023-01-29 11:51

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

我正在写一个字符串类,我希望它使用utf-8(存储在std :: string中)作为它的内部存储.我希望它能够兼顾"正常" std::stringstd::wstring输入输出.

使用std :: wstring不是问题,我可以std::codecvt_utf8用来转换和转换为std :: wstring.

然而,经过广泛的谷歌搜索和搜索SO我还没有找到一种方法来转换"正常/默认"C++ std :: string(我假设在Windows中使用本地系统本地化?)和utf-8标准: :串.

我想一个选择是首先将std :: string转换为std :: wstring std::codecvt,然后将其转换为utf-8,但是这看起来非常低效,因为至少char的前128个值应该翻译如果我理解正确,无论本地化如何,直接转到utf-8而不进行转换.

我发现了类似的问题:C++:如何将ASCII或ANSI转换为UTF8并存储在std :: string中 虽然我对这个答案有点怀疑,因为它很难编码为latin 1而我希望这适用于所有类型的本地化是安全的.

没有答案涉及提升感谢,我不希望让我的代码库使用它的头痛.

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);
    

    2023-01-29 11:55 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有