c++ - 如何使用标准 C++ 从 UTF-8 转换为 ANSI

标签 c++ stl std crt

我从数据库中读取了一些字符串,以 char* 和 UTF-8 格式存储(你知道,“á”被编码为 0xC3 0xA1)。但是,为了将它们写入文件,我首先需要将它们转换为 ANSI(不能以 UTF-8 格式制作文件......它只能读取为 ANSI),这样我的“á”就不会成为一个”。是的,我知道一些数据会丢失(中文字符,通常是 ANSI 代码页中没有的任何内容),但这正是我需要的。

但问题是,我需要代码在各种平台上编译,所以它必须是标准的 C++(即没有 Winapi,只有 stdlib、STL、crt 或任何具有可用源的自定义库)。

有人有什么建议吗?

最佳答案

几天前,有人回答说如果我有一个 C++11 编译器,我可以试试这个:

#include <string>
#include <codecvt>
#include <locale>

string utf8_to_string(const char *utf8str, const locale& loc)
{
    // UTF-8 to wstring
    wstring_convert<codecvt_utf8<wchar_t>> wconv;
    wstring wstr = wconv.from_bytes(utf8str);
    // wstring to string
    vector<char> buf(wstr.size());
    use_facet<ctype<wchar_t>>(loc).narrow(wstr.data(), wstr.data() + wstr.size(), '?', buf.data());
    return string(buf.data(), buf.size());
}

int main(int argc, char* argv[])
{
    string ansi;
    char utf8txt[] = {0xc3, 0xa1, 0};

    // I guess you want to use Windows-1252 encoding...
    ansi = utf8_to_string(utf8txt, locale(".1252"));
    // Now do something with the string
    return 0;
}

不知道响应发生了什么,显然有人删除了它。但是,事实证明这是完美的解决方案。对于发帖的人,非常感谢,你应该得到 AC 和 upvote!!

关于c++ - 如何使用标准 C++ 从 UTF-8 转换为 ANSI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17562736/

相关文章:

c++ - boost find in shared-memory方法卡在c++多进程项目中

c++ - GDI 函数在绘图时将 Alpha channel 设置为 0。为什么?

c++ - 根据类成员对同一键的多映射元素进行排序?

c++ - std::map 导致内存泄漏?

c++ - 在 C++ 中使用动态多维数组

c++ - 为什么 sscanf 无法从一个字符串中读取 uint64_t 和 char?

C++:STL 链表 - += 复制节点

c++ - 这种模板部分特化的目的是什么?

c++ - STL 位集移位运算符导致段错误

c++ - std::Invoke,找不到匹配的重载函数