美文网首页swift基础知识c&c++
随笔(关于Unicode 及 Unicode Consortiu

随笔(关于Unicode 及 Unicode Consortiu

作者: little_bottle09 | 来源:发表于2018-01-06 20:51 被阅读0次

    定义:

    • Unicode( 统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的 二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
      uico.jpg

    字符与编码 Characters and Encoding

    • 将人类自然语言的书写文字符号转换成数字机器能处理的“0”和“1”需要编码(Encoding)。
      把语言的字符集成,制定出字符集(CharacterSets)通常是国家政府或产业界制定出来的,着名的例子如中国的国家标准GB-2312丶繁体/正体字早期的业界标准Big5丶香港政府制定的香港增补字符集 HKSCS等等。
      由於各种字符集的标准不一,若有冲突的编码定义则不同语言文字符号无法在同一文件中出现,需要额外做转换。如中文简体字早期标准GB-2312和繁体/正体字早期标准Big5是不相容的,不但需要额外转换,这两种标准的文字是无法同时出现在一份文件里。

    此外,由於编码之间的相容性及应用程序如浏览器的支援不一,会发生编码错误以致显示内容不正确,又称乱码(Mojibake),或甚致是安全漏洞。

    Unicode标准与世界语言

    • Unicode标准所支援的世界书写语言详列於官方网站之Supported Scripts页面,中日韩共用的汉字(Han)早在1993年第1.1版已纳入。
      由於字符数及编码的特性,由Mark Davis所做的统计来看,Unicode标准中字符数占最多的是中国,占了7成以上,韩国次之占1成多。
    64a3a9e580bcdcc1b7e52475e271722.png

    Unicode CLDR数据库存有不少数据,可以使用XML或JSON格式取用,用於网站/软件的在地化(L10N, Localiation)及全球化(i18n, Internationalization)。

    此外,CLDR亦有地域-语言表,Territory Language Information,详列Unicode 用户贡献但经专家审批的各地域之语言人口侧写。

    Unicode标准统一编码的基础设施

    • 为解决编码交换等问题,为所有文本(在互联网和所有设备上)提供了基础设施。这基础设施的工作包括两部分:

    其一为为文本中使用的每个字符提供一个数字,而Unicode标准是这些数字的字典。
    其二是协助设备处理世界上所有的语言,因而联盟维护一大数据库,为不同的语言和国家提供的术语和格式 (Unicode, 2017)。此数据库名叫CLDR (Common Locale Data Repository),中译为「通用区域资料库」

    unicode格式

    • Unicode是一种可能的宽字符集。由 Unicode 协会开发的能表示几乎世界上所有书写语言的字符编码标准。Unicode 字符清单有多种代表形式,包括 UTF-8、UTF-16 和 UTF-32。大多 Windows 界面使用 UTF-16。
      Unicode 传输格式 8 (UTF-8)
      在 ASCII 码基础上发展的协议字符设置。UTF-8 协议提供 ASCII 码的扩展支持,UCS-2 码的翻译,国际 16 进制 Unicode 编码字符设置。与使用字符数据的 ASCII 或扩展 ASCII 编码相比,UTF-8 可获得更大范围的名称。
    • Unicode 字符系统 (UCS)
      作为 Unicode 标准一部分的国际标准字符集参考。现在广泛使用的 UCS 标准的版本是 UCS-2,该版本指定的 16 位字符数值已作为世界上大多数语言的编码标准而被接受,并得到了承认。
      直接选unicode就可以了。
      如果没有特殊字符,ansi保存也没事。

    Unicode 的常见表达形式

    • 一般而言,Unicode编码的书写表达形式以U+开头,接16进制符,如Unicode的笑脸😀:
    U+1F600
    

    Unicode列表时如Unicode 5.0的全部表情符号都采取这种编码书写方式
    URL在编码时,会把非ASCII字符及一些保留字符做转换,加以%符号以16进制符表示,如:

    %F0%9F%98%80
    

    (URL编码工具可用URL Decoder/EncoderATOOL

    Unicode 与 Emoji

    表情符号(Emoji)是一种象形文字 (图案符号),常在数字文本中使用来代表面孔丶天气丶车辆和建筑物丶食物和饮料丶动物和植物, 或代表情绪丶感觉或活动的图标,通常以丰富多彩的形式呈现。全球有近90%人口使用表情符号。


    296ef7b1a65d8e8dbb658f05ff150f5.png

    Unicode Emoji的支援需要厂商提供对映的Unicode 字型,如[非礼勿视猴(See-No-Evil Monkey)的表情符号]🙈(https://emojipedia.org/see-no-evil-monkey/),就有多种厂商提供。
    另外,如2017年Google Android 8.0有支援不同姓别及肤色的人物表情包。

    性别政治

    • 为了促进性别平等,2016年Unicode 的Emoji委员会同意加入11个表情符号,可以搭配不同的姓别及肤色,排列组合可以产出百多馀的表情符号(Bleuel, 2016)


      bde7d992ead7aeb440f8f1cb925594b.png

    在缅甸的罗兴亚人

    • 2017年底,Unicode联盟考虑编码“Hanifi Rohingya”的书写系统,是二十世纪八十年代为罗兴亚人开发的书写系统,罗兴亚人在之前并无通用的书面文字(Agence France-Presse, 2017)。
    • 尽管许多罗兴亚人在缅甸遭受与种族清洗相似的压迫时,缺乏识字和获取信息技术的机会,一套数字化字符集可以让罗兴亚人用自己的语言使用社交媒体,发送短信,写电子邮件等等。 但这一举措将产生重大的象征性后果。

    Unicode在东亚

    ->Unicode发展史上,一个重要的挑战和里程碑是统一汉字(Unihan)。

    Unihan的早期发展涉及中日韩三种语言所用的汉字,又称CJK,後期以有越南用的汉字加入,称CJKV。
    统一汉字的特点在于,如是几种语言共享的符号且经同意,是共享同一编码,专用的汉字则否。

    • 从多语互联网的角度,Unicode支持东亚主要的语言是互联网国际化的重要里程碑。日本科学技术与社会学者学者中山茂(Nakayama Shigeru)认为:
      东亚人习惯于处理多字节系统, 对比西方 单字节文化来说。对处理复杂系统来说, 我们东亚的多字节文化将在未来被证明是有优势的(p. 12)。
    • 参考文献:https://note.youdao.com/share/?token=15FEDD32D25B4083BFF2193C8C6364F3&gid=59950065
      u.jpg

    字集

    • XML及其子集 HTML采用UTF-8作为标准字集,理论上我们可以在各种支持XML标准的浏览器上显示任何地区文字的 网页,只要电脑本身安装有合适的字体即可。可以利用&#nnn;的格式显示特定的字符。nnn代表该字符的十进制 Unicode 代码。如果采用十六进制代码,在编码之前加上x字符即可。但部分旧版本的浏览器可能无法识别十六进制代码。
    • 然而部分由于Unicode 版本发展原因,很多浏览器只能显示UCS-2 完整 字符集也即日常使用的Unicode 版本中的一个小子集。

    使用:

    • 为什么使用Unicode?

    因为Unicode比ANSI好用。 自从Windows2K开始,Win的系统内核开始完全支持并完全应用Unicode编写,所有ANSI字符在进入底层前,都会被相应的API转换成Unicode。所以,如果你一开始就使用Unicode,则可以减少转换的用时和RAM开销。 对于JAVA/.NET等这些“新”的语言来说,内置的字符串所使用的字符集已经完全是Unicode。最重要的是,世界上大多数程序用的字符集都是Unicode,因为Unicode有利于程序国际化和标准化。
    链接:https://www.zhihu.com/question/23374078/answer/24385963

    Unicode 和 UTF-8 有何区别?

    • 简单来说:

    UTF-8 是对Unicode编码的一种编码方式。
    原因:节省流量和硬盘
    Unicode 是「字符集」UTF-8 是「编码规则」其中:字符集:为每一个「字符」分配一个唯一的 ID(学名为码位 / 码点 / Code Point)编码规则:将「码位」转换为字节序列的规则(编码/解码 可以理解为 加密/解密 的过程)

    • 广义的 Unicode 是一个标准,定义了一个字符集以及一系列的编码规则,即 Unicode 字符集和 UTF-8、UTF-16、UTF-32 等等编码……Unicode 字符集为每一个字符分配一个码位,例如「知」的码位是 30693,记作 U+77E5(30693 的十六进制为 0x77E5)。UTF-8 顾名思义,是一套以 8 位为一个编码单位的可变长编码。会将一个码位编码为 1 到 4 个字节:U+ 0000 ~ U+ 007F: 0XXXXXXX
      U+ 0080 ~ U+ 07FF: 110XXXXX 10XXXXXX
      U+ 0800 ~ U+ FFFF: 1110XXXX 10XXXXXX 10XXXXXX
      U+10000 ~ U+1FFFF: 11110XXX 10XXXXXX 10XXXXXX 10XXXXXX
      根据上表中的编码规则,之前的「知」字的码位 U+77E5 属于第三行的范围: 7 7 E 5
      0111 0111 1110 0101 二进制的 77E5

    0111   011111   100101 二进制的 77E5
    

    1110XXXX 10XXXXXX 10XXXXXX 模版(上表第三行)
    11100111 10011111 10100101 代入模版
    E 7 9 F A 5
    这就是将 U+77E5 按照 UTF-8 编码为字节序列 E79FA5 的过程。反之亦然

    为什幺要使用Unicode?

    (1) 可以很容易地在不同语言之间进行数据交换。
    (2) 使你能够分配支持所有语言的单个二进制.exe文件或DLL文件。
    (3) 提高应用程序的运行效率。

    • Windows 2000是使用Unicode从头进行开发的,如果调用任何一个Windows函数并给它传递一个ANSI字符串,那幺系统首先要将字符串转换成Unicode,然后将Unicode字符串传递给操作系统。如果希望函数返回ANSI字符串,系统就会首先将Unicode字符串转换成ANSI字符串,然后将结果返回给你的应用程序。进行这些字符串的转换需要占用系统的时间和内存。


      unicode1.jpg

    如何编写Unicode源代码?

    • Microsoft公司为Unicode设计了WindowsAPI,这样,可以尽量减少代码的影响。实际上,可以编写单个源代码文件,以便使用或者不使用Unicode来对它进行编译。只需要定义两个宏(UNICODE和_UNICODE),就可以修改然后重新编译该源文件。UNICODE宏用于C运行期头文件,而UNICODE宏则用于Windows头文件。当编译源代码模块时,通常必须同时定义这两个宏。

    Unicode和DBCS之间的区别

    • Unicode使用(特别在C程序设计语言环境里)“宽字符集”。「Unicode中的每个字符都是16位宽而不是8位宽。」在Unicode中,没有单单使用8位数值的意义存在。相比之下,在“双位组字符集”中我们仍然处理8位数值。有些位组自身定义字符,而某些位组则显示需要和另一个位组共同定义一个字符。
    • 处理DBCS字符串非常杂乱,但是处理Unicode文字则像处理有秩序的文字。您也许会高兴地知道前128个Unicode字符(16位代码从0x0000到0x007F)就是ASCII字符,而接下来的128个Unicode字符(代码从0x0080到0x00FF)是ISO 8859-1对ASCII的扩展。Unicode中不同部分的字符都同样基于现有的标准。这是为了便于转换。希腊字母表使用从0x0370到0x03FF的代码,斯拉夫语使用从0x0400到0x04FF的代码,美国使用从0x0530到0x058F的代码,希伯来语使用从0x0590到0x05FF的代码。中国、日本和韩国的象形文字(总称为CJK)占用了从0x3000到0x9FFF的代码。Unicode的最大好处是这里只有一个字符集,没有一点含糊。
    • 参考文献:浅谈在window系统下的Unicode

    Unicode的漏洞

    相关文章

      网友评论

        本文标题:随笔(关于Unicode 及 Unicode Consortiu

        本文链接:https://www.haomeiwen.com/subject/aklynxtx.html