字符 / 编码 / 编程语言 · 2023年 10月 11日 0

多字节字符和宽字符

76 次浏览

小时候,买东西的单位是一角、二角和五角,现在的单位是一元、五元和十元。人类社会的发展和计算机发展本质没啥两样,形态不同而已。

编码格式的历史

尽管早期只用ASCII码就可以表达所有字符,但计算机日益推广让其他国家不同语言的程序员也要表达自己国家的语言。比如中文、日文等等。出现了两个派别,一个是每个字符用固定字节数,一个是用不同字节数,但可以做兼容。

  • 宽字符:比如Unicode16或Unicode32,但这与已有的ASCII码(7bit或8bit)不兼容。同时,ASCII码使用很广泛,英文字母使用很多,宽字符反而浪费空间。
  • 多字节:多字节有不同形式,例如UTF-8,ASCII码占1字节,带变音符号的拉丁文等语言占2字节,大部分日韩、东南亚和中东使用的字符占3字节,其他极少数被使用的占4字节。这种编码格式兼容ASCII, 但中文占用空间较大。

不同语言的字符编码

  • Java/C# 字符类型默认是Unicode-16.
  • Python 2默认用ASCII码,Python 3默认是UTF-8编码,尽管如此,在2.1版本之后可以加"# -*- coding:"显式指明编码。
  • Go/Rust默认用UTF-8.
  • JS作为脚本语言,寄宿在HTML中随HTML编码影响,同时也可被script标签编码控制。

为了统一,源代码中字符串的编码和源代码编码保持一致。随着IDE不断发展,IDE可保存源代码为不同编码格式,编译器识别它们的不同,并正确识别源代码和内部的字符串。

为了搞清楚不同编程语言对编码的支持,对Python而言,可以用不同的coding设定和文件保存格式验证数据输出是否如预期。