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