繁体   English   中英

为什么std :: codecvt <wchar_t, char, mbstate_t> 不能按定义工作?

[英]Why does std::codecvt<wchar_t, char, mbstate_t> not work as defined?

#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构造构面

     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可能具有更合适的转换功能。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM