C语言控制台输出特殊字符都是问号? 用setlocale不行?你得用_setmode!

C语言控制台输出特殊字符都是问号? 用setlocale不行?你得用_setmode!

 

本人最近想写一个“将输入字符转换成 Unicode(UTF-16 BE)编码输出”的C语言控制台程序。

【1】英文字母、键盘符号:都很简单,这些都在 ASCII 内,用 char 类型再用 "%04X" 输出就可以。

【2】汉字:就不行了,它以两个字节存储,char 类型一个字节肯定搞不定。

怎么办?

网上学习了一下,可以用 wchar_t 宽字符类型配合 setlocale 函数解决。

【代码】wchar_t 输出中文宽字符示例

#include 
#include 
#include 
int main()
{
    setlocale(LC_ALL, "");
    wchar_t s[] = L"中文";
    wprintf(L"%s\n", s);
    return 0;
}

【3】特殊字符:尴尬了,输入的特殊字符能输出的都是 "?"。

(以下是我浏览的两篇有关 locale 的有价值的文章:)

[1] https://www.cnblogs.com/dejavu/archive/2012/09/16/2687586.html

[2] https://www.cnblogs.com/gatsby123/p/11150472.html

继续网上学习了一下,然而找了半天都是在说setlocale函数的问题。

说第二个参数,
为 NULL 就是不改变只读取,系统默认是只有ASCII大小的"C";
为 "" 就是Windows本地语言区域设置,简体中文windows当然就是简体中文;
为 "CHS" 就是设置为简体中文。

还有说代码页936、65001之类的。

为此我还看着文章[2]及其链接的locale wiki等网页所说明的setlocale函数的参数格式试了半天,试着怎么把它设置成不是简体中文而是unicode。

然而抓狂地试了半天就是试不出正确的格式……好吧,我放弃了,只能另辟蹊径了。

终于,我找到了一篇文章:

[3] https://blog.csdn.net/cOnhthefroad/article/details/102613322

作者提到了一个重要的命令:

【代码】让控制台启用Unicode 16

setmode(_fileno(stdout), _O_U16TEXT);

参考着作者的代码改了下,结果……

把字符预先写在代码里后运行是输出是正常的,然而控制台输入的字符再输出还是不行……我要疯了……

回过头来,我再一次研读起文章[1],想看看能不能发现什么。

文章[1]的作者重点指出了字符编码在控制台、输入输出流、二进制文件中有无转换的问题。

输入,输出;输入,输出;……

为什么文章[3]的命令可以输出代码里的特殊字符,从键盘输入的特殊字符就不可以?

我再仔细地瞧起这个让控制台启用Unicode 16的命令……

setmode(_fileno(stdout), _O_U16TEXT);

看到最中间的stdout,我眼前一亮!!!

于是,我在其上方加了一行:

_setmode(_fileno(stdin), _O_U16TEXT);

再次运行……啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊……成功了,成功了,成功了!

C语言控制台输出特殊字符都是问号? 用setlocale不行?你得用_setmode!_第1张图片

图中10个字符分别为:

数字符号 1

键盘符号 ' " \

英文字母 A

希腊字母 θ

法文字母 ç

俄文字母 Д

中文汉字 中 文

 

对了,你vs的.c或.cpp的代码页要在高级保存选项里改成1201(Unicode (Big-Endian) - 代码页 1201)。

 

文件菜单下没有高级保存选项?

工具->自定义->命令
打开“菜单栏”下拉框改成“文件”
点击“添加命令”
弹出的新窗口左边“类别”选择文件
右边“命令”向下滑动找到“高级保存选项(V)...”
选中后点击“确定”
原来的窗口的“预览”就可以发现“高级保存选项(V)...”出现在了第一行。

你可以“下移”调整它的位置,
然后点击“关闭”,
再次点击“文件”菜单,
你就可以找到“高级保存选项(V)...”了。

你可能感兴趣的:(C/C++,c语言,c++,字符串,unicode)