汉字
起源于中国的表意文字,在中文、日文和韩文中广泛使用。
汉字是起源于中国的表意文字,如今在日文和中文中仍被日常使用,在韩文和越南文中也曾在历史上使用过 (这一文化圈合称为 CJK)。日本在 2010 年 11 月公告的现行常用汉字表中规定了 2,136 个字,作为报纸、公文和教育中使用汉字的标准。中国大陆使用简体字,台湾和香港使用繁体字,同一个汉字在不同地区可能有不同的字形。
汉字最大的特点是信息密度高。每个字都承载独立的含义,因此可以用较少的字数传达更多信息。例如 5 个汉字的"字符数限制"在英文中相当于 "character limit" (15 个字符)。不过,如果简单地认为"信息密度高,所以在有字数限制的环境中占优势",就会在脚下失足。X (旧 Twitter) 采用按字符赋予权重的方式,包含汉字和假名的 CJK 字符按权重 2 计数。相对于上限 280,实质上只能放入 140 个字,因此如果按照可以使用与英文相同的 280 字额度这一前提去实现剩余字数,在日语输入时必定会出现落差。
日语中的汉字有音读 (源自中文的读法) 和训读 (日语固有的读法),同一个汉字根据语境有不同的读法。仅"生"这一个汉字就有"せい""しょう""い(きる)""う(まれる)""なま"等多种读法,这对日语学习者来说是一大难关。汉字读音的多样性也影响着文本转语音 (TTS) 和形态素分析的准确性。
在 Unicode 中,CJK 统一汉字作为 U+4E00 到 U+9FFF 收录了 20,992 个字,这一区块已经全域填满。若把 CJK 统一汉字扩展 A 至 J 也计入,则超过 10 万个字,在除去代理码位和私用区的已分配字符中,汉字占了六成以上。CJK 统一汉字将日本、中国、韩国和越南使用的同源汉字进行了统一 (Unification),字形有微妙差异的汉字可能被分配了相同的码位。
一个常见的误解是汉字几千年来没有变化。实际上,字形和用法随时代不断演变。日本多次修订官方汉字政策,包括 1946 年的当用汉字表和 2010 年的常用汉字表修订。中国在 20 世纪 50 年代的简化字改革中也大幅简化了许多汉字。
从字符计数的角度来看,每个汉字算作一个字符,但不同编码的字节数不同。UTF-8 中每个汉字占 3 个字节,UTF-16 中占 2 个字节 (BMP 范围内),Shift_JIS 中占 2 个字节。CJK 扩展 B 及以后 (BMP 之外) 的汉字在 UTF-16 中需要代理对 (4 个字节),而扩展 A 在 BMP 内仍是 2 个字节,因此在设置基于字节数的字符限制时需要考虑编码差异。
"只要是常用汉字就安全"这种想法也很危险。2010 年修订时追加的 196 个字中,"𠮟" (训读 shikaru) 位于 U+20B9F,处于基本多文种平面 (BMP) 之外。这一个字在 Shift_JIS 中无法表示,在 UTF-8 中占 4 个字节,在 UTF-16 中消耗 2 个单位。JavaScript 的 "𠮟".length 会返回 2,因此在朴素的字数检查中,1 个字会被数成 2 个字。出于同样的原因,姓名中含有人名用汉字异体字的输入,在以旧 Shift_JIS 为前提的系统或按字节数设上限的列中可能会被拒绝。在处理日语的表单中,实务上的指针是:存储用 UTF-8,数法统一为码位或书写素,并且不要以常用汉字的范围为依据就判断为安全一侧。