首页  > 计算机 >

Byte《=Char《=Grapheme

本文按署名·非商业用途·保持一致授权
作者:  ,发表于2010年02月13日17时13分 

以前只知道字节和字符的概念,今天看到一个函数,了解到了一个比字符更高阶的概念: Grapheme。查了字典,翻译为字形。后来去Unicode.org查阅了相关定义,字形(Grapheme)是一个文字系统里最小的书写单位。一般来说,一个unicode定义了一个字符,同时这个字符就是一个字形。但是有的字形很有可能是两个unicode字符组合而成,例如下面那个泰文(代码我用PHP实现,不懂PHP的我稍微解释一下就可以当伪码看了:grapheme_strlen接受的是一个utf-8编码的unicode字符串,而mb_strlen可以对传入的串根据指定的字符集进行字符数计算,所以mb_strlen我指定了utf-8):

$char="เก";
echo grapheme_strlen($char);//输出1
echo mb_strlen($char,'UTF-8');//输出2

其实我不太明白Grapheme存在的意义是什么。干嘛不直接unicode里留一个位置给每个多字符的Grapheme?

想来想去,只有一种情况可能用到:A和B组成一个Grapheme,可以写成AB连体,也可以写成C单体。当AB写在一起的时候,渲染系统就根据各种环境(字体或者其他环境变量)来决定是以AB双字形输出,还是以C单字形输出。但是这样处理的话,就导致在同一个环境(特别是同一种字体的情况下)下,只能以同一种字形来输出了。在一些场景里,特别是学术研究里,很有可能会要求分别输出两种字形。这样看来似乎在字符集里把AB和C分开定义比较好,这样设计字体的时候,就可以提供分别提供两个不同的输出。

越说下去,越觉得Grapheme的概念像字体。

不管了。。

明天就可以恭喜发财,利市落袋咯~~



发表评论

  本站文章若无注明,则以署名·非商业用途·保持一致授权
  桂ICP备05004302号 感谢WordPress提供本程序 本模板下载