↖  繁体简体中文转换与OpenCC概说..


繁体简体中文转换与OpenCC概说

2021-08-05 , 3000 , 101 , 169

听音频 🔊 . 看视频 🎦


[编按: 转载于 知乎网/三日月 綾香, 2020-08-03.]


目录

----

预备知识

Unicode 字符集

中文的地区差异

字形差异

编码差异

用字差异

OpenCC 标准

一简对多繁

一繁对多简

一繁对多繁

例外

用词差异

OpenCC 程序

OpenCC 原理

OpenCC 应用

问与答

如何查看汉字的 Unicode 码位?

如何查看 Unicode 码位对应的字符?

Unicode 和 UTF-8 有什么区别?



正文

----


预备知识

Unicode 字符集

gbk-big5-2.png

在计算机中储存的字符,都要经过 编码。目前通用的编码是 UTF-8 编码。

UTF-8 编码的对象是 Unicode 字符集,换言之,只有 Unicode 字符集收录的字符才能被编码。

Unicode 字符集的每个字符都有唯一的 Unicode 码位。一段连续的 Unicode 码位称为 区。

Unicode 中收录的汉字分布在以下几个区:

中日韩统一表意文字 (U+4E00-U+9FFF)

中日韩统一表意文字扩充区A (U+3400-U+4DBF)

中日韩统一表意文字扩充区B (U+20000-U+2A6DF)

中日韩统一表意文字扩充区C (U+2A700-U+2B73F)

中日韩统一表意文字扩充区D (U+2B740-U+2B81F)

中日韩统一表意文字扩充区E (U+2B820-U+2CEAF)

中日韩统一表意文字扩充区F (U+2CEB0-U+2EBEF)

中日韩统一表意文字扩充区G (U+30000-U+3134F)


从码位并不能直接判断简繁体。

有一些区是为兼容其他字符集而设的,称为 兼容区;还有一些区域是为用户自己造字而设的,称为 私人使用区(PUA),一般情况下不应使用。但是,这些区的字符在计算机上的显示效果有时与普通的字符并无差异,在处理来源不明的数据时需要特别留意。


中文的地区差异

中国大陆、香港、台湾、日本、韩国、新加坡等地各有不同的汉字标准(或规范,以下通称标准),详见维基百科 汉字标准列表。

中文环境的汉字标准共有五种:

简体中文(中国大陆),简称「大陆简体」

简体中文(新加坡),与大陆简体相同,仅用词有别

繁體中文(香港),简称「香港繁體」

繁體中文(臺灣),简称「臺灣繁體」或「臺灣正體」

繁體中文(中國大陸),简称「大陸繁體」

实际上大陆繁体并不常见,因为大陆出版的古籍亦需要保留原文样态,不会随意根据现代标准修改。

地区差异分为以下几类:

句子的表达方式不同(最难,本文暂不讨论)

句子大致相同,用词不同(称「用词差异」)

用词相同,但汉字的形态可能不同。这分为三种情况:

汉字形态不同,但 Unicode 码位相同(称「字形差异」)

汉字形态不同,且 Unicode 码位也不同,但是同一汉字(称「编码差异」)

汉字形态不同,且 Unicode 码位也不同,但是不同汉字(称「用字差异」)

以下分别讲解。


字形差异

例如「削弱」一词,香港与台湾均用「削(U+524A)弱」,但是分别使用香港与台湾的字体显示,会有明显差异。

香港:

台湾:

-loading- -loading--loading-


gbk-big5.png

UfqiLong

此类差异,需要用户选用合适的字体,方能正确显示,例如 思源黑体 支持陆、港、台、日、韩五地的汉字字形。

作为开发者,通常是通过在代码中指定语言来解决,例如「育」字:

      

  • 大陆:

  • 台湾:


    效果如下:

    大陆:育

    台湾:育

    编码差异

    对于「说明」一词中的「说」字,香港用「説」(U+8AAC),台湾用「說」(U+8AAA),码位本身就不相同。但是,尽管「説」、「說」码位不同,却明显是同一汉字,这样的关系称为 微差异码。

    gbk-big5-3.png

    OpenCC 用字标准制定的原则之一是「能分则不合」,基本杜绝了下面提到的几类「一对多」问题。


    一简对多繁

    「一简对多繁」是指同一个简体汉字可能对应多个繁体汉字的现象。由于一简对多繁,在将简体汉字转换为繁体汉字时,不能简单地逐字转换,需要考虑上下文。


    gbk-big5-4.png


    例外

    OpenCC 基本杜绝了「一对多问题」,换言之,如果文本使用 OpenCC 用字标准,转换为其他用字标准时通常不会出现「一对多」,故不需要根据上下文进行额外的判断。

    但是,OpenCC 标准也有少数例外:

    一、「湧」、「涌」问题


    OpenCC 繁体   / 香港繁体


    涌                     / 湧(湧起)    

                            / 涌(普通话 chōng,粤语 cung¹,東涌)    

    「涌」是粤语区常见的地名用字。OpenCC 标准依据的是古代传统典籍,根据《说文解字》确定「涌」为「湧」的本字,因此将「湧」写为「涌」,并不考虑粤语区的情况。


    二、「无线」、「有线」问题

    实际使用时,由于历史原因,并不一定遵守标准。如香港公司名:「無綫」、「有線」。


    用词差异

    不同地区的用词存在差异。例如:

    中国大陆和台湾称草莓,香港称为士多啤梨

    变压器在香港及中国大陆部分使用粤语的地方称为「火牛」

    在中国大陆,通常称为「自行车」;台湾称「脚踏车」,江浙、上海、福建等地亦有「脚踏车」一称;在香港、澳门、广东、广西、湖南等中国南方地区则更常称其为「单车」;在新加坡、马来西亚、广东潮汕地区则称之「脚车」,江西赣语更称之为「线车(嘚)」、「钢丝车」、「脚踏车嘚」

    出于本地化的需要,繁简转换通常至少需要考虑中国大陆、台湾、香港的用词差异。

    用字差异、编码差异与用词差异无关,是相互独立的:

    不是用字差异或编码差异、是用词差异:大陆繁、台湾用「隱私」,香港用「私隱」

    是用字差异、不是用词差异:大陆繁、台湾用「床前」,香港用「牀前」

    -loading- -loading--loading-


    UfqiLong

    是编码差异、不是用词差异:大陆繁、香港用「用户」,台湾用「用戶」


    OpenCC 程序

    OpenCC 原理

    OpenCC 是用于繁简转换的程序,许多 Linux 发行版已内置该程序,Windows 系统亦可自行编译安装。

    由于「一对多」现象的存在,繁简转换不是简单地逐字对应,而是需要以词为单位考虑。因此,繁简转换分为两步:分词与词汇转换。

    OpenCC 默认采用「正向最长匹配」的分词算法。例如,若词库中同时存在「快取」、「記憶體」和「快取記憶體」,则「快取記憶體」的切分结果为「快取記憶體」而不是「快取/記憶體」。

    词汇转换就是将分词后的词汇逐一查找转换表。若有多个结果,就返回第一个。

    若用户编译 OpenCC 不成功,也可以自行实现。下面是使用 57 行 Python 代码的一种简易实现(仅为示例,不做性能优化,且命令行参数有一定差异)。

    首先将 词典数据 置于 data 文件夹中,然后编写代码如下:

    (参考: https://github.com/BYVoid/OpenCC  )

    (在线演示 online demo: https://opencc.byvoid.com/ )


    OpenCC 应用

    OpenCC 可在命令行中使用,亦可通过 API 在程序中调用。

    命令行用法

    将繁体中文(OpenCC 标准)转换为简体中文(中国大陆),不转换用词:

    $ echo '嘗試' | opencc -c t2s 

    尝试

    将简体中文(中国大陆)转换为繁体中文(香港),不转换用词:

    $ echo '地球仪' | opencc -c s2hk 

    地球儀

    将简体中文(中国大陆)转换为繁体中文(台湾),转换用词:

    $ echo '内存' | opencc -c s2twp 

    記憶體


    应用举例:输入法

    字形上,应能根据用户语言自动调整字体。作为开发者,通常是通过在代码中指定语言

    用字上,

    词条应只收繁体字(OpenCC 标准),然后通过转换模块完成繁简转换

    单字应酌情收录异体字,以确保在某个标准下可以打出非标准用字,如「綫」,但应把字频调低

    用词上,应多地兼收,如「網絡」、「網路」


    问与答

    如何查看汉字的 Unicode 码位?

    使用 Python 查看汉字的 Unicode 码位:

    >>> print(hex(ord('一'))) 

    0x4e00

    将 0x 换为 U+,即可得到汉字「一」的 Unicode 码位为 U+4E00。


    如何查看 Unicode 码位对应的字符?

    使用 Python 查看 Unicode 码位对应的字符:

    >>> print(chr(0x9fa5)) 


    这说明 Unicode 码位 U+9FA5 对应汉字「龥」。


    Unicode 和 UTF-8 有什么区别?

    Unicode 是 字符集,UTF-8 是对 Unicode 字符集的一种 编码方式。

    $ python -c 'print(hex(ord("湫")))' 

    0x6e6b 

    $ echo -n 湫 | xxd -ps 

    e6b9ab

    前两行表明「湫」字的 Unicode 码位是一个抽象的十六进制数字 U+6E6B,不涉及具体编码;后两行表明「湫」字在计算机中实际上是以十六进制的 UTF-8 编码 e6b9ab 存储的。





+简体中文 +概说 +码位 +差异 +汉字

本页Url

↖回首页 +当前续 +尾续 +修订 +评论✍️


👍27 仁智互见 👎1
  • 还没有评论. → +评论
  • -loading- -loading- -loading-


    🤖 智能推荐

    -loading- -loading- -loading-

     


    网络平台算法典型问题治理

    Elon Musk马斯克发

    美国国务卿卢比奥在中国问题

    全国招投标内定有多严重?

    + 公库 公库
    AddToFav   
    新闻 经典 官宣