Unicode

Unicode,全称为Unicode标准(The Unicode Standard),其官方机构Unicode联盟所用的中文名称为统一码[1],又译作万国码、统一字符码、统一字符编码[2],是信息技术领域的业界标准,其整理、编码了世界上大部分的文字系统,使得电脑能以通用划一的字符集来处理和显示文字,不但减轻在不同编码系统间切换和转换的困扰,更提供了一种跨平台乱码问题解决方案。Unicode由非营利机构Unicode联盟(Unicode Consortium)负责维护,该机构致力让Unicode标准取代既有的字符编码方案,因为既有方案编码空间有限,亦不适用于多语环境。

Unicode伴随着通用字符集ISO/IEC 10646的标准而发展,同时也以书本的形式[3]对外发表。Unicode至今仍在不断增修,每个新版本都加入更多新的字符。目前最新的版本为2022年9月公布的15.0.0[4],已经收录超过14万个字符(第十万个字符在2005年获采纳)。Unicode标准不仅仅只是为文字指定代码。除了涵盖视觉上的字形、编码方法、标准的字符编码资料外,联盟官方出版品还包含了关于各书写系统的细节及呈现方式,如规范化的准则、拆分、测序绘制双向文本显示、书写方向、字符特性(如大小写字母)等等。此外还提供参考资料和视觉图像,以帮助开发者和设计师正确应用标准。

Unicode备受认可,为ISO纳入国际标准,成为通用字符集,即 ISO/IEC 10646。Unicode兼容ISO/IEC 10646,能完整对应各个版本标准[5][6]。Unicode广泛应用于电脑软件的国际化与本地化过程。很多新科技,如可扩展置标语言(Extensible Markup Language,简称:XML)、Java编程语言以及现代操作系统,都采用Unicode来编码。Unicode最普遍的编码格式是和ASCII兼容的UTF-8,以及和UCS-2兼容的UTF-16

起源与发展

Unicode为解决传统字符编码方案的局限而产生,例如ISO 8859-1所定义的字符虽然在不同的国家中广泛地使用,可是在不同国家间却经常出现不兼容的情况。很多传统的编码方式都有共同的问题,即容许电脑处理双语环境(通常使用拉丁字母以及其本地语言),但却无法同时支持多语言环境(指可同时处理多种语言混合的情况)。

Unicode编码包含了不同写法的字,如“ɑ/a”、“強/强”、“戶/户/戸”。然而在汉字方面引起了一字多形的认定争议,详见中日韩统一表意文字

在文字处理方面,统一码为每一个字符而非字形定义唯一的代码(即一个整数)。换句话说,统一码以一种抽象的方式(即数字)来处理字符,并将视觉上的演绎工作(例如字体大小、外观形状、字体形态、文体等)留给其他软件来处理,例如网页浏览器或是文字处理器。

目前,几乎所有电脑系统都支持基本拉丁字母,并各自支持不同的其他编码方式。Unicode为了和它们相互兼容,其首256个字符保留给ISO 8859-1所定义的字符,使既有的西欧语系文字的转换不需特别考量;并且把大量相同的字符重复编到不同的字符码中去,使得旧有纷杂的编码方式得以和Unicode编码间互相直接转换,而不会丢失任何信息。举例来说,全角格式区段包含了主要的拉丁字母的全角格式,在中文、日文、以及韩文字形当中,这些字符以全角的方式来呈现,而不以常见的半角形式显示,这对竖排文字和等宽排列文字有重要作用。

在表示一个Unicode的字符时,通常会用“U+”然后紧接着一组十六进制的数字来表示这一个字符。在基本多文种平面里的所有字符,要用四个数字(即2字节,共16位,例如U+4AE0,共支持六万多个字符);在零号平面以外的字符则需要使用五或六个数字。旧版的Unicode标准使用相近的标记方法,但却有些微小差异:在Unicode 3.0里使用“U-”然后紧接着八个数字,而“U+”则必须随后紧接着四个数字。

编码范围

文字范围

0000-007F:C0控制符及基本拉丁文(C0 Control and Basic Latin)

0080-00FF:C1控制符及拉丁文补充-1(C1 Control and Latin 1 Supplement)

0100-017F:拉丁文扩展-A(Latin Extended-A)

0180-024F:拉丁文扩展-B(Latin Extended-B)

0250-02AF:国际音标扩展(IPA Extensions)

02B0-02FF:空白修饰字母(Spacing Modifiers)

0300-036F:结合用读音符号(Combining Diacritics Marks)

0370-03FF:希腊文及科普特文(Greek and Coptic)

0400-04FF:西里尔字母(Cyrillic)

0500-052F:西里尔字母补充(Cyrillic Supplement)

0530-058F:亚美尼亚语(Armenian)

0590-05FF:希伯来文(Hebrew)

0600-06FF:阿拉伯文(Arabic)

0700-074F:叙利亚文(Syriac)

0750-077F:阿拉伯文补充(Arabic Supplement)

0780-07BF:马尔代夫语(Thaana)

07C0-077F:西非书面语言(N'Ko)

0800-085F:阿维斯塔语及巴列维语(Avestan and Pahlavi)

0860-087F:曼达安语(Mandaic)

0880-08AF:撒马利亚语(Samaritan)

0900-097F:天城文书(Devanagari)

0980-09FF:孟加拉语(Bengali)

0A00-0A7F:古木基文(Gurmukhi)

0A80-0AFF:古吉拉特文(Gujarati)

0B00-0B7F:奥里亚文(Oriya)

0B80-0BFF:泰米尔文(Tamil)

0C00-0C7F:泰卢固文(Telugu)

0C80-0CFF:卡纳达文(Kannada)

0D00-0D7F:马拉雅拉姆语(Malayalam)

D80-0DFF:僧伽罗语(Sinhala)

0E00-0E7F:泰文(Thai)

0E80-0EFF:老挝文(Lao)

0F00-0FFF:藏文(Tibetan)

1000-109F:缅甸语(Myanmar)

10A0-10FF:格鲁吉亚语(Georgian)

1100-11FF:朝鲜文字母(Hangul Jamo)

1200-137F:埃塞俄比亚语(Ethiopic)

1380-139F:埃塞俄比亚语补充(Ethiopic Supplement)

13A0-13FF:切罗基语(Cherokee)

1400-167F:统一加拿大土著语音节(Unified Canadian Aboriginal Syllabics)

1680-169F:欧甘字母(Ogham)

16A0-16FF:如尼文(Runic)

1700-171F:塔加洛语 (Tagalog)

1720-173F:哈努诺文(Hanunóo)

1740-175F:布锡文(Buhid)

1760-177F:塔格巴努亚文(Tagbanwa)

1780-17FF:高棉语(Khmer)

1800-18AF:蒙古文(Mongolian)

18B0-18FF:鞑靼语(Cham)

1900-194F:林布文(Limbu)

1950-197F:德宏傣语(Tai Le)

1980-19DF:新傣仂语(New Tai Lue)

19E0-19FF:高棉语记号(Khmer Symbols)

1A00-1A1F:布吉文(Buginese)

1A20-1A5F:巴塔克文(Batak)

1A80-1AEF:兰纳文(Lanna/Tai Tham)

1B00-1B7F:巴厘语(Balinese)

1B80-1BB0:巽他语(Sundanese)

1BC0-1BFF:救世苗文(Pahawh Hmong)

1C00-1C4F:雷布查语(Lepcha)

1C50-1C7F:奥尔其基语字母(Ol Chiki)

1C80-1CDF:曼尼普尔语(Meithei/Manipuri)

1D00-1D7F:语音学扩展(Phonetic Extensions)

1D80-1DBF:语音学扩展补充(Phonetic Extensions Supplement)

1DC0-1DFF:结合用读音符号补充(Combining Diacritics Marks Supplement)

1E00-1EFF:拉丁文扩充附加(Latin Extended Additional)

1F00-1FFF:希腊语扩充(Greek Extended)

2000-206F:常用标点(General Punctuation)

2070-209F:上标及下标(Superscripts and Subscripts)

20A0-20CF:货币符号(Currency Symbols)

20D0-20FF:组合用记号(Combining Diacritics Marks for Symbols)

2100-214F:字母式符号(Letterlike Symbols)

2150-218F:数字形式(Number Form)

2190-21FF:箭头(Arrows)

2200-22FF:数学运算符(Mathematical Operator)

2300-23FF:杂项工业符号(Miscellaneous Technical)

2400-243F:控制图片(Control Pictures)

2440-245F:光学识别符(Optical Character Recognition)

2460-24FF:封闭式字母数字(Enclosed Alphanumerics)

2500-257F:制表符(Box Drawing)

2580-259F:方块元素(Block Element)

25A0-25FF:几何图形(Geometric Shapes)

2600-26FF:杂项符号(Miscellaneous Symbols)

2700-27BF:印刷符号(Dingbats)

27C0-27EF:杂项数学符号-A(Miscellaneous Mathematical Symbols-A)

27F0-27FF:追加箭头-A(Supplemental Arrows-A)

2800-28FF:盲文点字模型(Braille Patterns)

2900-297F:追加箭头-B(Supplemental Arrows-B)

2980-29FF:杂项数学符号-B(Miscellaneous Mathematical Symbols-B)

2A00-2AFF:追加数学运算符(Supplemental Mathematical Operator)

2B00-2BFF:杂项符号和箭头(Miscellaneous Symbols and Arrows)

2C00-2C5F:格拉哥里字母(Glagolitic)

2C60-2C7F:拉丁文扩展-C(Latin Extended-C)

2C80-2CFF:古埃及语(Coptic)

2D00-2D2F:格鲁吉亚语补充(Georgian Supplement)

2D30-2D7F:提非纳文(Tifinagh)

2D80-2DDF:埃塞俄比亚语扩展(Ethiopic Extended)

2E00-2E7F:追加标点(Supplemental Punctuation)

2E80-2EFF:CJK部首补充(CJK Radicals Supplement)

2F00-2FDF:康熙字典部首(Kangxi Radicals)

2FF0-2FFF:表意文字描述符(Ideographic Description Characters)

3000-303F:CJK符号和标点(CJK Symbols and Punctuation)

3040-309F:日文平假名(Hiragana)

30A0-30FF:日文片假名(Katakana)

3100-312F:注音字母(Bopomofo)

3130-318F:朝鲜文兼容字母(Hangul Compatibility Jamo)

3190-319F:象形字注释标志(Kanbun)

31A0-31BF:注音字母扩展(Bopomofo Extended)

31C0-31EF:CJK笔画(CJK Strokes)

31F0-31FF:日文片假名语音扩展(Katakana Phonetic Extensions)

3200-32FF:封闭式CJK文字和月份(Enclosed CJK Letters and Months)

3300-33FF:CJK兼容(CJK Compatibility)

3400-4DBF:CJK统一表意符号扩展-A(CJK Unified Ideographs Extension-A)

4DC0-4DFF:易经六十四卦符号(Yijing Hexagrams Symbols)

4E00-9FFF:CJK统一表意符号(CJK Unified Ideographs)

A000-A48F:彝文音节(Yi Syllables)

A490-A4CF:彝文字根(Yi Radicals)

A500-A61F:瓦伊语(Vai)

A660-A6FF:统一加拿大土著语音节补充(Unified Canadian Aboriginal Syllabics Supplement)

A700-A71F:声调修饰字母(Modifier Tone Letters)

A720-A7FF:拉丁文扩展-D(Latin Extended-D)

A800-A82F:锡尔赫特文字母(Syloti Nagri)

A840-A87F:八思巴字(Phags-pa)

A880-A8DF:索拉什特拉语Saurashtra

A900-A97F:爪哇语(Javanese)

A980-A9DF:查克玛语(Chakma)

AA00-AA3F:Varang Kshiti

AA40-AA6F:索拉索姆字母(Sorang Sompeng)

AA80-AADF:尼瓦尔语(Newari)

AB00-AB5F:越南傣语(Vi?t Thái)

AB80-ABA0:克耶字母(Kayah Li)

AC00-D7AF:朝鲜文音节(Hangul Syllables)

D800-DBFF:High-half zone of UTF-16

DC00-DFFF:Low-half zone of UTF-16

E000-F8FF:自行使用区域(Private Use Zone)

F900-FAFF:CJK兼容象形文字(CJK Compatibility Ideographs)

FB00-FB4F:字母表达形式(Alphabetic Presentation Form)

FB50-FDFF:阿拉伯表达形式A(Arabic Presentation Form-A)

FE00-FE0F:变量选择符(Variation Selector)

FE10-FE1F:竖排形式(Vertical Forms)

FE20-FE2F:组合用半符号(Combining Half Marks)

FE30-FE4F:CJK兼容形式(CJK Compatibility Forms)

FE50-FE6F:小型变体形式(Small Form Variants)

FE70-FEFF:阿拉伯表达形式B(Arabic Presentation Form-B)

FF00-FFEF:半型及全型形式(Halfwidth and Fullwidth Form)

FFF0-FFFF:特殊(Specials)

10000–1FFFF:第1辅助平面,多文种补充平面(Supplementary Multilingual Plane, SMP)

20000–2FFFF:第2辅助平面,表意文字补充平面(Supplementary Ideographic Plane, SIP)

30000–3FFFF:第3辅助平面,表意文字第三平面(Tertiary Ideographic Plane, TIP)

40000–DFFFF:第4-13辅助平面,尚未使用

E0000–EFFFF:第14辅助平面,特别用途补充平面(Supplementary Special-purpose Plane, SSP)

F0000–FFFFF:第15辅助平面,保留作为私人使用区(Private Use Area, PUA)

100000–10FFFF:第16辅助平面,保留作为私人使用区(Private Use Area, PUA)

注意:表意文字

3400-4DBF/4E00-9FFF/20000-3FFFF:中日韩越统一表意文字(CJKV Unified Ideographs)

ASCII码

大多数计算机采用美国标准信息交换码(ASCII码),它是表示所有大小写字母、数字、标点符号和控制字符的7位编码方案。统一码包含ASCII码,'\u0000'到'\u007F'对应全部128个ACSII字符。在JAVA中可以使用统一码。

Related

JS生成任意长度的随机汉字

最近突发奇想,想试试用编程方式请求百度来进行随机搜索,这就需要随机生成一窜汉字字符。经过网络上的一番搜索,发现可以用unicode编码来实现。Unicode编码是16进制数,其中汉字对应范围是[\u4e00-\u9fa5],而4e00和9af5是16进制值。因此我们需要通过parseInt转换,得到他们10进制的数值19968-40869,也就是下文中的start和end。接着我们再随机生成start和end之间的一个数,然后将这个数转换成16进制,并用\u拼接起来,这样一个随机的代表汉字的Unicode编码就产生了。如果需要生成多个汉字,则直接使用for循环即可。最后用eval输出一下生成的随机Unicode编码,就能得到一窜随机的汉字。const createRandomChinese = (count:number) => { const start = parseInt('4e00', 16) const end = parseInt('9fa5', 16) let name = '' for(let i = 0; i < count; i++) { const cha = Math.floor(Math.random() * (end - start)) name += '\\u' + (start + cha).toString(16) } return eval(`'${name}'`) } 测试结果如下:最后提一嘴,如何通过fetch对百度发起随机搜索请求。首先通过开发者模式,观察搜索过程中的网络请求,发现想通过编程方式对百度发起搜索请求,可以用fetch发送GET请求:fetch('https://www.baidu.com/s?wd=%E8%A1%A8%E7%A4%BA%E8%AE%BA&rsv_spt=1&rsv_iqid=0xe96276d80016e9b0&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_dl=tb&rsv_sug2=0&rsv_btype=i&inputT=1778&rsv_sug4=2384')这里的wd参数,就是我们搜索时输入的字符串。因此,上面我们有了随机的汉字字符串,想要借此发起随机搜索请求,就很容易了,直接这么写const RandomSearch = (count:number) => { const start = parseInt('4e00', 16) const end = parseInt('9fa5', 16) let name = '' for(let i = 0; i < count; i++) { const cha = Math.floor(Math.random() * (end - start)) name += '\\u' + (start + cha).toString(16) } let chinese = eval(`'${name}'`) fetch(`https://www.baidu.com/s?wd=${chinese}&rsv_spt=1&rsv_iqid=0xe96276d80016e9b0&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_dl=tb&rsv_sug2=0&rsv_btype=i&inputT=1778&rsv_sug4=2384`) .then((res)=>console.log(res)) }不过这可能只能在控制台可以执行,不然会有跨域问题,在本文中就不多说了。
2024-08-28 11:15:56
Get connected with us on social networks! Twitter

©2024 Guangzhou Sinephony Technology Co., Ltd All Rights Reserved