gpt4 book ai didi

c++ - 为什么 std::codecvt 不能按定义工作?

转载 作者:可可西里 更新时间:2023-11-01 11:31:46 27 4
gpt4 key购买 nike

#include <iostream>

using namespace std;

void f1()
{
wcout.imbue(locale("chs"));
wcout << L"您" << endl;
}

void f2()
{
locale loc(wcout.getloc(), new codecvt<wchar_t, char, mbstate_t>());

wcout.imbue(loc);
wcout << L"好" << endl;
}

int main()
{
f1(); // OK
f2(); // Error. There is no output as expected.
}

根据 cplusplus.com的在线文档:

codecvt<wchar_t,char,mbstate_t>: 

converts between native wide and narrow character sets.

本程序用VC++编译,Windows运行。

在本程序中,内部字符集为UCS-2,由VC++编译器定义;外部字符集,即窄字符集,在控制台环境下是GBK(中文字符集)。如果文档为真,则 wcout 可以像 f1() 一样将 unicode 字符串从 UCS-2 转换为 GBK;然而,事实并非如此。为什么?

最佳答案

您默认构造了一个 std::codecvt,没有特定的转换规则。它无法知道您需要 GBK 而不是 GB18030 或 UTF-8。

获取wchar_t转GBK的codecvt的方法:

  • 为 GBK 构造一个 std::locale 只需将其与您的流一起使用,无需拉出一个方面

    wcout.imbue(std::locale("")); // this uses the current user settings,
    wcout.imbue(std::locale("zn_CN.gbk")); // or name the locale explicitly,
    // by whatever name Windows calls it
  • 直接用std::codecvt_byname构造facet

    wcout.imbue(std::locale(wcout.getloc(),
    new std::codecvt_byname("zh_CN.gbk")); // explict name
  • 编写您自己的转换例程并派生自 std::codecvt,因此您可以将其与

    一起使用
    wcout.imbue(std::locale(wcout.getloc(), new yourcodecvt);

Windows 对 C++ 语言环境的支持很差,不过,WinAPI 可能有更合适的转换函数。

关于c++ - 为什么 std::codecvt<wchar_t, char, mbstate_t> 不能按定义工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18932096/

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