编码模式

又称: 数据模式, 数字模式, 字母数字模式, 字节模式, 汉字模式

定义

编码模式是二维码把字符打包成比特的方式。主要有四种:数字、字母数字、字节和汉字,同一个二维码里可以在它们之间切换。

四种主要模式

每种模式都在字符范围和密度之间取舍。数字模式只能处理数字,但每三个数字只占 10 位;字节模式能处理任何字节,但每个字节要用 8 位。

字母数字模式覆盖一个 45 个字符的集合:数字 0–9、大写字母 A–Z、空格,以及符号 $ % * + - . / 和冒号。小写字母不在其中,所以全大写的网址生成的二维码,可以比同一个小写网址更小。

  • 数字:数字 0–9,每 3 个数字 10 位
  • 字母数字:45 个字符,每 2 个字符 11 位
  • 字节:任意 8 位数值,每字节 8 位
  • 汉字:Shift JIS 双字节字符,每个 13 位

模式指示符与分段

每一段数据都以一个 4 位的模式指示符和字符计数开头,计数的长度取决于模式和版本。一个二维码可以包含多个这样的分段,例如长串数字用数字模式,其余用字节模式,这样得到的结果可能更小。

另外几个 4 位的指示符表示的是功能而不是字符集:ECI 用来声明字符编码,结构化追加用来把数据拆分到多个二维码中,FNC1 用于 GS1 和其他行业数据格式。以四个零位构成的终止符结束数据。

  • 数字 0001,字母数字 0010,字节 0100,汉字 1000
  • ECI 0111,结构化追加 0011
  • FNC1 第一位置 0101,第二位置 1001
  • 终止符 0000

字节模式与字符集

标准对字节模式的默认解释是 ISO-8859-1(Latin-1),但如今大多数生成器写入的是 UTF-8,这样带重音的字母、其他文字和表情符号才不会丢失。读取器通常通过检查字节来识别 UTF-8。

如果字符集必须明确无误,可以用 ECI 头部明确声明。没有它,读取器偶尔会猜错,显示出乱码。

常见问题

为什么用了小写字母,我的二维码就更大了?

小写字母不在字母数字集合内,所以文本必须用字节模式,每个字符占 8 位,而不是 5.5 位。大写字母、数字和少数符号能打包得更紧凑。

二维码能存储表情符号或非拉丁文字吗?

能,用字节模式配合 UTF-8,大多数生成器和手机读取器都支持。这类字符每个占多个字节,所以容量会降低。

一个二维码能混合数字和文本数据吗?

能。数据可以分成若干段,每段有自己的模式,好的编码器会选择让二维码最小的分法。

来源与标准

全部术语