现代C++实战30讲
吴咏炜
前 Intel 资深软件架构师
立即订阅
3685 人已学习
课程目录
已更新 14 讲 / 共 30 讲
0/4登录后,你可以任选4讲全文学习。
课前必读 (2讲)
开篇词 | C++这么难,为什么我们还要用C++?
免费
课前必读 | 有关术语发音及环境要求
基础篇 (9讲)
01 | 堆、栈、RAII:C++里该如何管理资源?
02 | 自己动手,实现C++的智能指针
03 | 右值和移动究竟解决了什么问题?
04 | 容器汇编 I:比较简单的若干容器
05 | 容器汇编 II:需要函数对象的容器
06 | 异常:用还是不用,这是个问题
07 | 迭代器和好用的新for循环
08 | 易用性改进 I:自动类型推断和初始化
09 | 易用性改进 II:字面量、静态断言和成员函数说明符
提高篇 (3讲)
10 | 到底应不应该返回对象?
11 | Unicode:进入多文字支持的世界
12 | 编译期多态:泛型编程和模板入门
现代C++实战30讲
登录|注册

11 | Unicode:进入多文字支持的世界

吴咏炜 2019-12-20
你好,我是吴咏炜。
这一讲我们来讲一个新话题,Unicode。我们会从编码的历史谈起,讨论编程中对中文和多语言的支持,然后重点看一下 C++ 中应该如何处理这些问题。

一些历史

ASCII [1] 是一种创立于 1963 年的 7 位编码,用 0 到 127 之间的数值来代表最常用的字符,包含了控制字符(很多在今天已不再使用)、数字、大小写拉丁字母、空格和基本标点。它在编码上具有简单性,字母和数字的编码位置非常容易记忆(相比之下,设计 EBCDIC [2] 的人感觉是脑子进了水,哦不,进了穿孔卡片了;难怪它和 IBM 的那些过时老古董一起已经几乎被人遗忘)。时至今日,ASCII 可以看作是字符编码的基础,主要的编码方式都保持着与 ASCII 的兼容性。
ASCII 里只有基本的拉丁字母,它既没有带变音符的拉丁字母(如 é 和 ä ),也不支持像希腊字母(如 α、β、γ)、西里尔字母(如 Пушкин)这样的其他欧洲文字(也难怪,毕竟它是 American Standard Code for Information Interchange)。很多其他编码方式纷纷应运而生,包括 ISO 646 系列、ISO/IEC 8859 系列等等;大部分编码方式都是头 128 个字符与 ASCII 兼容,后 128 个字符是自己的扩展,总共最多是 256 个字符。每次只有一套方式可以生效,称之为一个代码页(code page)。这种做法,只能适用于文字相近、且字符数不多的国家。比如,下图表示了 ISO-8859-1(也称作 Latin-1)和后面的 Windows 扩展代码页 1252(下图中绿框部分为 Windows 的扩展),就只能适用于西欧国家。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《现代C++实战30讲》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(5)

  • hello world
    唉,一直对这个字符编码不太感冒

    作者回复: 理解透了,也没有多复杂。比编程简单多了。

    2019-12-21
  • _呱太_
    老师好!能不能提前透露一下单元测试库是用的哪个库啊,最近在看 TDD,想上手一下,感觉现在最缺的也是测试方面的能力。

    作者回复: 我考虑讲的是 Boost.Test 和 Catch2。

    2019-12-21
  • LiKui
    通过BOM判断文件编码方式:
    如果文件开头是0x0000 FEFF,则是UTF-32 BE方式编码
    如果文件开头是0xFFFE 0000,则是UTF-32 LE方式编码
    如果文件开头是0xFFFE,则是UTF-16 LE的方式编码
    如果文件开头是0xFEFF,则是UTF-16 BE的方式编码
    如果文件开头是0xEF BB BF,则是UTF-8方式编码
    否则编码方式使用其它算法确定
    2019-12-20
  • 三味
    这两天写玩具代码, 环境就是win10, vs2017, 写控制台. 我源代码是utf8无bom格式. 什么都好, 就是用fgets获取输入, 无法获取中文字符串... 折腾好久... 最后还是都改成了ansi... ansi这个诡异的名字确实值得吐槽啊...明明就是GBK... 字符编码真是太麻烦了...

    作者回复: ANSI 是指 Windows 的传统系统编码。源代码中如果含中文,必须用 UTF-8 + BOM 保存(专栏中说过的)。

    2019-12-20
  • chado
    1.每个字符的字节数固定,可能需要判断的就是一个大小端的问题
    2.有些表情符号(如emoji),会使用两个字符来产生,增加了可见字符的判断
    3.utf-8是最省空间的编码方式,每个编码只用到需要最少的字节数

    作者回复: 1. 部分正确。处理过程中(读入文件后)连大小端都不会考虑的。
    2. 不是。Emoji 在 UTF-32 里仍然是一个字符。
    3. 不对。再想想。

    2019-12-20
    2
收起评论
5
返回
顶部