C++ 输出Unicode字符的正确方法

正确输出 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(取自己所需要的编码方案)
  • 该特殊字符所占用的字节空间

结语

当我们通过某些数据类型存取特殊字符,而发现输出乱码的时候,排除控制台代码页和文档编码的因素,往往是分配的地址空间不足以容纳该特殊字符导致的。知道特殊字符的对应编码,并知悉它所占用的字节空间,大部分情况下便可有效避免乱码。

 

 

 

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值