C++ Windows CMD未正确输出UTF-16

C++ Windows CMD未正确输出UTF-16,c++,unicode,encoding,utf-8,utf-16,C++,Unicode,Encoding,Utf 8,Utf 16,我试图将非ascii字符输出到Windows CMD,但问题是,它不起作用。我没有写下面的代码,我把这两部分粘在了一起。该代码应该将字符转换为UTF-8,然后从UTF-8转换为UTF-16,以便在Windows上正确显示。代码如下: // codecvt::in example #include <iostream> // std::wcout, std::wcout #include <locale> // std::locale, std:

我试图将非ascii字符输出到Windows CMD,但问题是,它不起作用。我没有写下面的代码,我把这两部分粘在了一起。该代码应该将字符转换为UTF-8,然后从UTF-8转换为UTF-16,以便在Windows上正确显示。代码如下:

// codecvt::in example
#include <iostream>       // std::wcout, std::wcout
#include <locale>         // std::locale, std::codecvt, std::use_facet
#include <string>         // std::wstring
#include <cwchar>         // std::mbstate_t

void GetUnicodeChar(unsigned int code, char chars[5]) {
        if (code <= 0x7F) {
            chars[0] = (code & 0x7F); chars[1] = '\0';
        } else if (code <= 0x7FF) {
            // one continuation byte
            chars[1] = 0x80 | (code & 0x3F); code = (code >> 6);
            chars[0] = 0xC0 | (code & 0x1F); chars[2] = '\0';
        } else if (code <= 0xFFFF) {
            // two continuation bytes
            chars[2] = 0x80 | (code & 0x3F); code = (code >> 6);
            chars[1] = 0x80 | (code & 0x3F); code = (code >> 6);
            chars[0] = 0xE0 | (code & 0xF); chars[3] = '\0';
        } else if (code <= 0x10FFFF) {
            // three continuation bytes
            chars[3] = 0x80 | (code & 0x3F); code = (code >> 6);
            chars[2] = 0x80 | (code & 0x3F); code = (code >> 6);
            chars[1] = 0x80 | (code & 0x3F); code = (code >> 6);
            chars[0] = 0xF0 | (code & 0x7); chars[4] = '\0';
        } else {
            // unicode replacement character
            chars[2] = 0xEF; chars[1] = 0xBF; chars[0] = 0xBD;
            chars[3] = '\0';
        }
    }

int main ()
{
  typedef std::codecvt<wchar_t,char,std::mbstate_t> facet_type;

  std::locale mylocale;

  const facet_type& myfacet = std::use_facet<facet_type>(mylocale);

  char mystr[5];
  GetUnicodeChar(225, mystr);

  // prepare objects to be filled by codecvt::in :
  wchar_t pwstr[sizeof(mystr)];              // the destination buffer (might be too short)
  std::mbstate_t mystate = std::mbstate_t(); // the shift state object
  const char* pc;                            // from_next
  wchar_t* pwc;                              // to_next

  // translate characters:
  facet_type::result myresult = myfacet.in (mystate,
      mystr, mystr+sizeof(mystr), pc,
      pwstr, pwstr+sizeof(mystr), pwc);

  if ( myresult == facet_type::ok )
  {
    std::wcout << L"Translation successful: ";
    std::wcout << pwstr << std::endl;
  }
  return 0;
}
//codevt::在示例中
#包括//std::wcout,std::wcout
#包括//std::locale、std::codecvt、std::use\u facet
#include//std::wstring
#包括//标准::mbstate\u t
void GetUnicodeChar(无符号整数代码,字符[5]){
若有(代码6),;
字符[0]=0xC0 |(代码&0x1F);字符[2]='\0';
}否则,如果(代码>6);
字符[1]=0x80 |(代码&0x3F);代码=(代码>>6);
字符[0]=0xE0 |(代码&0xF);字符[3]='\0';
}否则,如果(代码>6);
字符[2]=0x80 |(代码&0x3F);代码=(代码>>6);
字符[1]=0x80 |(代码&0x3F);代码=(代码>>6);
字符[0]=0xF0 |(代码&0x7);字符[4]='\0';
}否则{
//unicode替换字符
字符[2]=0xEF;字符[1]=0xBF;字符[0]=0xBD;
字符[3]='\0';
}
}
int main()
{
typedef std::codevt facet_type;
std::locale mylocale;
const facet_type&myfacet=std::use_facet(mylocale);
char-mystr[5];
GetUnicodeChar(225,mystr);
//准备要由codecvt::in填充的对象:
wchar_t pwstr[sizeof(mystr)];//目标缓冲区(可能太短)
std::mbstate_t mystate=std::mbstate_t();//移位状态对象
const char*pc;//来自下一步
wchar_t*pwc;//下一步
//翻译字符:
facet_type::result myresult=myfacet.in(mystate,
mystr、mystr+sizeof(mystr)、pc、,
pwstr,pwstr+sizeof(mystr),普华永道;
if(myresult==facet_type::ok)
{

std::wcout您需要首先设置_O_u16文本模式:

_setmode(_fileno(stdout), _O_U16TEXT);

更多信息参见Michael Kaplain的一篇老博客:

我添加了你建议的代码,但现在它只输出:Ã。如果你看Michael的例子,他使用了
wprintf()
而不是
printf()
。他还提到了UTF-8的
和UTF-16的
\U16TEXT
。我试过printf()还有,我听说Windows CMD不能输出UTF-8,是真的吗?