CJK (中日韩统一表意文字)
在 Unicode 中统一处理中文、日文、韩文共用汉字的体系,即 CJK Unified Ideographs。
CJK 是 Chinese (中文)、Japanese (日文)、Korean (韩文) 的首字母缩写,指这三种语言共用的汉字体系。在 Unicode 中,它们作为 CJK Unified Ideographs 被统一分配码位。核心区块是基本多语言平面 (BMP) 的 U+4E00 到 U+9FFF,拥有 20,992 个码位。在此之上还有扩展 A 到扩展 J 的各个区块,在 2025 年 9 月公开的 Unicode 17.0 中,扩展 J 追加了 4,298 个字,CJK 统一汉字的总数超过了 10 万字。
汉字统一 (Han Unification) 是 CJK 的核心设计方针。中国的简体字与繁体字、日本汉字、韩国汉字之中,历史上具有同一起源的字符会被分配相同的码位。例如"直"字在中日韩的字形略有差异,但在 Unicode 中都是 U+76F4。由于显示出来的字形取决于所选字体,因此准确指定 HTML 的 lang 属性、让浏览器挑选合适的字体十分重要。
CJK 字符以全角宽度显示,位于 BMP 的汉字在 UTF-8 中每个字符占 3 个字节,在 UTF-16 中占 2 个字节。同样是 100 个字符的文本,英文 (ASCII) 为 100 个字节,中文则为 300 个字节 (UTF-8),字符数与字节数之间的偏离很大。在数据库的容量设计和网络带宽的估算中,必须把这一差异计算进去。需要留意的是扩展区块的处理方式。扩展 A 位于 BMP 之内,所以是 3 个字节,但扩展 B 之后被放在 BMP 之外,在 UTF-8 中是 4 个字节,在 UTF-16 中也会以代理对的形式占 4 个字节。JavaScript 的 String.length 会把它数成 2,因此在接受含扩展汉字的人名或地名的表单里,剩余字数的显示会与外观相差 2 倍。
CJK 文本的另一个特征是词与词之间没有空格。英文用空白作为单词的分隔符,而中文和日文没有这样的分隔。因此,搜索引擎的索引构建和词数统计需要用到形态素分析 (如日文的 MeCab) 或 N-gram 方式。换行处理的前提也与英文不同,CJK 原则上可以按字符换行,但另一方面需要针对不能出现在行首的标点和右括号做禁则处理。CSS 中可以用 line-break 和 word-break 来调整这一行为。
汉字统一也面对着一些批评。日文的"骨"和中文的"骨"字形不同,却被分配了相同的码位,所以要在同一份文档里分别使用中日两种字形,就需要通过 CSS 的 font-family 或字体特性来控制。Unicode 的 IVS (Ideographic Variation Sequence,表意文字变体序列) 是部分解决这一课题的机制。
从字符计数的角度看,CJK 的 1 个字符承载的信息量更大,同样的内容有时能用比英文更少的字符数装下。不过,这并不一定直接等于在投稿栏里占便宜。X (Twitter) 会给每个字符加上权重再合计,以 280 这个上限来判定,而中文、日文和表情符号的 1 个字符按权重 2 计数,因此只用日文写的投稿实际上到 140 个字符就触及上限了。也就是说,字符数少这一好处的代价,是 1 个字符被数成 2,中间夹了一层双重换算。在自家服务里设置字数限制时,要先定下 CJK 是数成 1 还是数成 2、还是按显示宽度来判定,并注意不要与投稿目的地的数法产生冲突。