概述
正确输出 Unicode 字符
要输出特殊符号首先需要知道它的 Unicode 编码,当然,直接在剪切板里 copy 对应符号也是可以的。
要查询字符对应的 Unicode 编码,可以在如下网站:https://unicode-table.com/cn/
以恒等符号 ≡ 为例,我们查询它的 Unicode编码为:u2261
Linux下:
#include <iostream>
using namespace std;
int main (){
cout << "≡ is the same as u2261" << endl;
string s("≡ is the same as u2261");
cout << s << endl;
}
程序输出如下:
≡ is the same as ≡
≡ is the same as ≡
我们可能会好奇,≡ 究竟占多少个字节?如果知道它占了多少个字节,我们就能很方便的对这个符号进行存取:
(1)首先用一种简单的办法:
string s("u2261");
cout << s.size() << endl;
程序输出如下:
3
如此,我们可以很方便的存取它:
//string s("u2261");
char* c = new char[3];
copy(s.begin(), s.begin()+3, c);
cout << c << endl;
程序将输出:
≡
(2)如果知道 unicode 编码对应的字节数,就不必如此做了:
注:表格来自于博客 https://www.cnblogs.com/zizifn/p/4716712.html
Bits of code point | First code point | Last code point | Bytes in sequence | Byte 1 | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Byte 6 |
7 | U+0000 | U+007F | 1 | 0xxxxxxx |
|
|
|
|
|
11 | U+0080 | U+07FF | 2 | 110xxxxx | 10xxxxxx |
|
|
|
|
16 | U+0800 | U+FFFF | 3 | 1110xxxx | 10xxxxxx | 10xxxxxx |
|
|
|
21 | U+10000 | U+1FFFFF | 4 | 11110xxx | 10xxxxxx | 10xxxxxx | 10xxxxxx |
|
|
26 | U+200000 | U+3FFFFFF | 5 | 111110xx | 10xxxxxx | 10xxxxxx | 10xxxxxx | 10xxxxxx |
|
31 | U+4000000 | U+7FFFFFFF | 6 | 1111110x | 10xxxxxx | 10xxxxxx | 10xxxxxx | 10xxxxxx | 10xxxxxx |
通过查表我们得知 u2206 在范围 u0800 - uFFFF 之间,这个编码范围对应的字节数是:3。
windows下:
#include <stdio.h>
#include <windows.h>
int main (){
SetConsoleOutputCP(65001);
printf("≡n");
}
程序将输出:
≡
函数 SetConsoleOutputCP 用于设置控制台程序输出代码页,代码页是字符集编码的别名。
只介绍两种常用的代码页编号:
- 936 简体中文
- 65001 UTF-8
如果想打印其他语种,可以在网上查询一下代码页表,选取需要的字符集编码。
如此,便可以正确打印出特殊字符了。
当然,也可以也可以通过文件流将特殊字符在文件里存取,需要注意:
- 保存文档编码为UTF-8(取自己所需要的编码方案)
- 该特殊字符所占用的字节空间
结语
当我们通过某些数据类型存取特殊字符,而发现输出乱码的时候,排除控制台代码页和文档编码的因素,往往是分配的地址空间不足以容纳该特殊字符导致的。知道特殊字符的对应编码,并知悉它所占用的字节空间,大部分情况下便可有效避免乱码。
最后
以上就是酷炫睫毛膏为你收集整理的C++ 输出Unicode字符的正确方法正确输出 Unicode 字符的全部内容,希望文章能够帮你解决C++ 输出Unicode字符的正确方法正确输出 Unicode 字符所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复