(Translated by https://www.hiragana.jp/)
UTF-8 - 维基百科,自由的百科全书

UTF-8

すべ一碼編碼不同的字節倍數

UTF-88-bit Unicode Transformation FormatいちしゅはりたいUnicodeてき可變長かへんちょうもとへん,也是いちぜん缀码。它可以用一至四个字节对Unicode集中しゅうちゅうてき所有しょゆう有效ゆうこう编码てん进行编码,ぞくUnicode标准てきいち部分ぶぶん最初さいしょゆかり肯·汤普逊罗布·かつ提出ていしゅつ[2][3]よし于较しょう值的编码てん一般使用频率较高,直接ちょくせつ使用しようUnicode编码效率こうりつ低下ていか大量たいりょうなみ费内そんそら间。UTF-8就是为了解りょうかい决向きさきけんようASCII码而设计,Unicode中前ちゅうぜん128个字使用しようあずかASCII码相どうてき二进制值的单个进行编码,而且字面じめんあずかASCII码的字面じめんいちいち对应,這使とくばららい處理しょりASCIIもとてき軟體須或ただ須做しょう份修あらためそく繼續けいぞく使用しようよし此,它逐ややなりため電子でんし郵件あみぺーじ及其ほかもうかそんある傳送でんそう文字もじ優先ゆうせん採用さいようてきへん碼方しき

UTF-8
语言國際こくさい
标准Unicode
ぶんEASCII
变长编码
Unicode转换格式かくしき
つぶせてんUS-ASCII
变换/编码ISO 10646 (Unicode)
まえようUTF-1
顯示けんじりょうたにしょ記錄きろくてき2001ねんいたり2012ねん主要しゅようへん碼方法的ほうてき使用しよう情況じょうきょう[1]2008ねん,UTF-8てき使用しようりつちょう所有しょゆう其他编码方式ほうしきざい2012ねんちょう所有しょゆう网页てき60%。其中ASCII onlyきょく线包括ほうかつ所有しょゆう包含ほうがんASCIIてき网页,无论もとすうすえちゅう声明せいめい如何いか

2009ねん以来いらい,UTF-8いちちょくまん维网てきさい主要しゅようてき编码形式けいしき(对所有しょゆう,而不仅是Unicode范围ないてき编码)(并由WHATWG宣布せんぷ强制きょうせいせいてき“适用于所有しょゆう事物じぶつ(for all things)”,[4]截止いた2019ねん11月, ざい所有しょゆう网页ちゅう,UTF-8编码应用りつだか达94.3%(其中いち些仅ASCII编码,いん为它UTF-8てきしゅう),而在はいめい最高さいこうてき1000个网页中うらない96%。[5] だい二热门的多字节编码方式Shift JISGB 2312ふん具有ぐゆう0.3%0.2%てき占有せんゆうりつ[6][7][1]Internet邮件联盟( Internet Mail Consortium, IMCたて所有しょゆう电子邮件ほどじょのう使用しようUTF-8展示てんじ创建邮件,[8] W3Cけん议UTF-8さく为XMLぶんけんHTMLぶんけんてきだま认编码方しき[9]あみぎわもう工程こうてい工作こうさくしょうぐみ(IETF)要求ようきゅう所有しょゆうあみぎわもう協議きょうぎ必須ひっす支持しじUTF-8へん[10]互聯もう郵件聯盟れんめい(IMC)建議けんぎ所有しょゆう電子でんし郵件軟件支持しじUTF-8へん碼。[11]

歷史れきし

编辑

1992年初ねんしょため建立こんりゅう良好りょうこうてきもとぐみくしへん系統けいとう以供おおもとぐみもとしゅう使用しよう開始かいしりょういち正式せいしきてき研究けんきゅうISO/IEC 10646てき初稿しょこう中有ちゅうういち必須ひっすてき附錄ふろくめいためUTF。とうちゅう包含ほうがんりょういちきょう32もとてきもと使用しようてきもとくみくしへん系統けいとう。這個へん碼方しきてき性能せいのうなみれいじん滿まんただし提出ていしゅつりょうしょう0-127てき範圍はんい保留ほりゅうきゅうASCII以相ようきゅう系統けいとうてき概念がいねん

1992ねん7がつX/Open委員いいんかいXoJIG開始かいしひろもとめ一個較佳的編碼系統。Unix系統けいとう實驗じっけんしつ(USL)てきDave Prosserため提出ていしゅつりょういちへん系統けいとうてき建議けんぎ。它具備ぐびさら快速かいそくさくてき特性とくせいなみ引入一項新的改進。其中,7もとてきASCII符號ふごうただ代表だいひょうばららいてき意思いし所有しょゆうもとぐみ序列じょれつそくかい包含ほうがんだい8もとてき符號ふごう,也就所謂いわゆるてき最高さいこう有效ゆうこうもと

1992ねん8がつ,這個建議けんぎよしIBMX/Openてき代表だいひょう流傳りゅうでんいたいち些感興趣きょうしゅてき團體だんたいあずか此同かいなんじ實驗じっけんしつきゅうごう計畫けいかく作業さぎょう系統けいとう工作こうさくしょうぐみてき肯·汤普逊たい這編碼系統けいとう作出さくしゅつ重大じゅうだいてきおさむあらためゆずるへん碼可以自わがどう使つかいとく必從くしてきひらきくび讀取よみと,也能找出あいだてき分界ぶんかい。1992ねん9がつ2にち肯·汤普逊勃·かつ一起かずきざい美國びくに新澤にいざわ西にししゅう一架餐車的餐桌墊上描繪出此設計的要點。せっらいてき日子にっし,Pike及汤ひろし逊將它實現じつげんなみはた這編碼系統けいとう完全かんぜん應用おうようざいきゅうごう計畫けいかくとうなか,及後しょうゆうせき成果せいかかい饋X/Open。

1993ねん1がつ25-29にちてきざい聖地せいちきば舉行てきUSENIX會議かいぎくび正式せいしきかい紹UTF-8。

1996ねんおこりほろてきCAB(MS Cabinet)規格きかくざいUTF-8標準ひょうじゅん正式せいしき落實ぜん就明かくようもと在任ざいにんなん地方ちほう使用しようUTF-8へん系統けいとうただしゆうせきてきへん碼器實際じっさいじょう從來じゅうらいぼつゆうさく方面ほうめんてき規格きかく

结构

编辑

UTF-8使用しよういちいたりろくもとぐみためごとへん碼(儘管如此,2003ねん11がつUTF-8RFC 3629じゅう新規しんきはんただのう使用しようばららいUnicode定義ていぎてき區域くいき,U+0000いたU+10FFFF,也就せつ最多さいたよんぶし):

  1. 128US-ASCIIただ需一個位元組編碼(Unicode範圍はんいよしU+0000いたりU+007F)。
  2. おびゆう附加ふか符号ふごうてきひしげちょうあやまれ臘文西里にしざとなんじ字母じぼ亞美あみあままれはくらいぶんおもねひしげはくぶん敘利ぶん它拿字母じぼのり需要じゅよう兩個りゃんこもとくみへん碼(Unicode範圍はんいよしU+0080いたりU+07FF)。
  3. 其他基本きほんぶんしゅ平面へいめん(BMP)ちゅうてきもと(這包含ほうがんりょうだい部分ぶぶん常用じょうよう,如大部分ぶぶんてき漢字かんじ使用しよう三個位元組編碼(Unicode範圍はんいよしU+0800いたりU+FFFF)。
  4. 其他極少きょくしょう使用しようてきUnicode 輔助平面へいめんてきもと使用しよう四至六位元組編碼(Unicode範圍はんいよしU+10000いたりU+1FFFFF使用しようよんぶし,Unicode範圍はんいよしU+200000いたりU+3FFFFFF使用しようぶし,Unicode範圍はんいよしU+4000000いたりU+7FFFFFFF使用しようろくぶし)。

たい上述じょうじゅつひさげ及的だいよんしゅもと而言,UTF-8使用しよう四至六個位元組來編碼似乎太耗費資源了。ただしUTF-8たい所有しょゆう常用じょうようてきもと以用さんもとくみ表示ひょうじ,而且它的另いちしゅ選擇せんたくUTF-16へんたい前述ぜんじゅつてきだい四種字符同樣需要四個位元組來編碼,所以ゆえんよう決定けっていUTF-8あるUTF-16哪種へん比較ひかく有效ゆうこうりつかえようしょ使用しようてきもとてきぶん範圍はんい而定。,如果使用しよう一些傳統的壓縮系統,DEFLATEのり這些不同ふどうへん系統けいとうあいだてきてき差異さい就變とくほろ不足ふそくどうりょうわか顧及傳統でんとう壓縮あっしゅく算法さんぽうざい壓縮あっしゅく較短文字もじじょうてき效果こうかだい考慮こうりょ使用しようUnicode標準ひょうじゅん壓縮あっしゅく格式かくしき(SCSU)。

描述

编辑
 
UnicodeあずかUTF-8てき轉換てんかん

目前もくぜんゆうこういく份關於UTF-8詳細しょうさい規格きかくてきぶんけんただし這些ぶんけんざい定義ていぎじょうゆう些許てき不同ふどう

  • RFC 3629 / STD 63(2003),這份ぶんけん制定せいていりょうUTF-8標準ひょうじゅんてきあみぎわもう協議きょうぎ元素げんそ
  • だいよんはん,The Unicode Standard,§3.9-§3.10(2003)
  • ISO/IEC 10646-1:2000附加ふかぶんけんD(2000)

它們取だいりょう以下いか些被淘汰とうたてき定義ていぎ

  • ISO/IEC 10646-1:1993修正しゅうせいあん2/附加ふかぶんけんR(1996)
  • だいはん,The Unicode Standard附錄ふろくA(1996)
  • RFC 2044(1996)
  • RFC 2279(1998)
  • だいさんはん,The Unicode Standard,§2.3(2000)及勘あやまひょう#1:UTF-8 Shortest Form(2000)
  • Unicode Standard附加ふかぶんけん#27: Unicode 3.1(2001)

事實じじつじょう所有しょゆう定義ていぎてき基本きほん原理げんりしょうどうてき,它們あいださい主要しゅようてき不同ふどう支持しじてきもと範圍はんい無效むこう輸入ゆにゅうてき處理しょり方法ほうほう

Unicodeもとてきもと分割ぶんかつためすう部分ぶぶんなみ分配ぶんぱいいたUTF-8てきもとぐみくしちゅう較低てきもとてき位置いちざいU+0080てき以下いかもと使用しよう內含其字もとてきたんもとぐみへん碼。這些へん碼正こう對應たいおう7もとてきASCIIざい其他情況じょうきょうゆう可能かのう需要じゅようたち4もとぐみらい表示ひょうじいちもと。這些もとぐみてき最高さいこう有效ゆうこうもとかい設定せっていなり1,以防止ぼうしあずか7もとてきASCII混淆こんこうなみ保持ほじ標準ひょうじゅんてきもとくみ主導しゅどうくしうんさくじゅん

だい範圍はんい
じゅうろくしんせい
しるべりょう值(scalar value)
しんせい
UTF-8
しんせいじゅうろくしんせい
註釋ちゅうしゃく
000000 - 00007F
128だい
00000000 00000000 0zzzzzzz 0zzzzzzz(00-7F) ASCIIもと範圍はんいもとぐみよしれい開始かいし
ななz ななz
000080 - 0007FF
1920だい
00000000 00000yyy yyzzzzzz 110yyyyy(C0-DF) 10zzzzzz(80-BF) だいいちもとくみよし110開始かいしせっちょてきもとくみよし10開始かいし
さんy;y;ろくz y;ろくz
000800 - 00D7FF
00E000 - 00FFFF
61440だい[Note 1]
00000000 xxxxyyyy yyzzzzzz 1110xxxx(E0-EF) 10yyyyyy 10zzzzzz だいいちもとくみよし1110開始かいしせっちょてきもとくみよし10開始かいし
よんx;よんy;y;ろくz よんx;ろくy;ろくz
010000 - 10FFFF
1048576だい
000wwwxx xxxxyyyy yyzzzzzz 11110www(F0-F7) 10xxxxxx 10yyyyyy 10zzzzzz はたよし11110開始かいしせっちょてきもとくみよし10開始かいし
さんw;x;よんx;よんy;y;ろくz さんw;ろくx;ろくy;ろくz
Note 1 Unicodeざい範圍はんいD800-DFFFちゅうそん在任ざいにんなんもと基本きほんぶんしゅ平面へいめんちゅう約定やくじょうりょう這個範圍はんいよう於UTF-16擴展標識ひょうしき辅助平面へいめん兩個りゃんこUTF-16表示ひょうじいち辅助平面へいめん)。當然とうぜんにんなんへん碼都以被轉換てんかんいた這個範圍はんいただしざいunicodeちゅう們並代表だいひょうにんなんごう法的ほうてき值。

れい如,まれはくらい语字ははaleph(א)てきUnicodeだい码是U+05D0,按照以下いか方法ほうほうあらためなりUTF-8:

  • 它属于U+0080いたU+07FF区域くいき,这个ひょう说明它使用しようそう节,110yyyyy 10zzzzzz.
  • じゅうろく进制てき0x05D0换算なり进制就是101-1101-0000.
  • 这11すう按顺じょにゅう"y"部分ぶぶん"z"部分ぶぶん:11010111 10010000.
  • さいきさき结果就是そう节,ようじゅう六进制写起来就是0xD7 0x90,这就这个aleph(א)てきUTF-8编码。

所以ゆえん开始てき128个字もと(US-ASCII)ただいち节,せっらいてき1920个字需要じゅようそう节编码,包括ほうかつ附加ふか符号ふごうてきひしげ丁字ていじははまれ腊字はは西里にしざと尔字ははひろしとく字母じぼ亚美あま亚语字母じぼまれはくらいぶん字母じぼおもねひしげはく字母じぼてきもと基本きほんぶんしゅ平面へいめんちゅう其余てきもと使用しようさん个字节,剩余じょうよ使用しようよん个字节。

すえ这种方式ほうしき以处さらだい数量すうりょうてきもとはららいてき规范まこと许长达6节的序列じょれつ以覆盖到31もと通用つうようしゅうはららいてき极限)。つきかん如此,2003ねん11がつUTF-8RFC 3629じゅうしん规范,ただのう使用しようばららいUnicodeてい义的区域くいき,U+0000いたU+10FFFF。すえ这些规范,以下いか节值はた无法现在合法ごうほうUTF-8序列じょれつちゅう

编码(进制 编码(じゅうろく进制 ちゅう
1100000x C0, C1 过长编码:そう序列じょれつてき头字节,ただし码点 <= 127
1111111x FE, FF 无法达到:7ある8序列じょれつてき头字节
111110xx
1111110x
F8, F9, FA, FB, FC, FD RFC 3629规范:5ある6序列じょれつてき头字节
11110101
1111011x
F5, F6, F7 RFC 3629规范:码点ちょう过10FFFFてき头字节

UTF-8编码节含义

编辑
  • 对于UTF-8编码ちゅうてき任意にんい节B,如果Bてきだいいち为0,则B独立どくりつてき表示ひょうじいち个字(ASCII码);
  • 如果Bてきだいいち为1,だい为0,则B为一个多字节字符中的一个字节(ASCII);
  • 如果Bてきぜん两位为1,だいさん为0,则B为两个字节表示ひょうじてきちゅうてきだいいち个字节;
  • 如果Bてきまえさん为1,だいよん为0,则B为三个字节表示的字符中的第一个字节;
  • 如果Bてきまえよん为1,だい为0,则B为四个字节表示的字符中的第一个字节;

いん此,对UTF-8编码ちゅうてき任意にんい节,すえだいいち判断はんだん为ASCIIすえぜん判断はんだん该字节是为一个字符编码的第一个字节;すえぜんよん(如果ぜん两位ひとし为1),确定该字节为编码てきだいいち个字节,并且判断はんだん对应てきよし几个表示ひょうじすえぜん(如果まえよん为1),判断はんだん编码いやゆう错误あるかずすえ传输过程ちゅういやゆう错误。

設計せっけいUTF-8てき理由りゆう

编辑

UTF-8てき設計せっけいゆう以下いかてきもとぐみ序列じょれつてき特質とくしつ

  • 單位たんいもとぐみてき最高さいこう有效ゆうこうもと永遠えいえんため0。
  • もとぐみ序列じょれつちゅうてきくびもとぐみてきいく最高さいこう有效ゆうこうもと決定けっていりょう序列じょれつてきちょう最高さいこう有效ゆうこうため110てき2もとぐみ序列じょれつ,而1110てきさんもとぐみ序列じょれつ,如此類推るいすい
  • もとぐみ序列じょれつちゅう其餘てきもとぐみちゅうてきくび兩個りゃんこ最高さいこう有效ゆうこうもとため10

UTF-8てき這些特質とくしつ保證ほしょうりょういちてき序列じょれつかい包含ほうがんざいいちてき序列じょれつちゅう。這確保かくほりょう以位もとぐみため基礎きそてき份字くしたい(sub-string match)方法ほうほう適用てきよう於在文字もじちゅうさがせひろあるゆう些比較舊てき可變長かへんちょう8もとへん碼(如Shift JISぼつゆう這個特質とくしつくしたいてき算法さんぽうへんどく相當そうとう複雜ふくざつ。雖然這增加ぞうかりょうUTF-8へん碼的くしてきしんいき冗餘ただし於弊。另外,資料しりょう壓縮あっしゅくなみUnicodeてき目的もくてき所以ゆえん不可ふかこんためいちだんそく使つかいざい傳送でんそう過程かてい中有ちゅうう份位もとぐみいん錯誤さくごある擾而完全かんぜん遺失いしつかえゆう可能かのうざいした一個字符的起點重新同步,れい受損範圍はんい受到げんせい

另一方面ほうめんゆかり於其もとくみ序列じょれつ設計せっけい,如果一個疑似為字符串的序列被驗證為UTF-8へん碼,麼我們可以有把握はあくせつ它是UTF-8くし。一段兩位元組隨機序列碰巧為合法的UTF-8而非ASCIIてきりつため32ふん1。たい於三位元組序列的機率為256ふん1,たいさらちょうてき序列じょれつてきりつ就更ていりょう

UTF-8てきへん碼方しき

编辑

UTF-8UNICODEてき一種變長度的編碼表達方式《一般いっぱんUNICODEためそうもとぐみゆびUCS2)》,它由肯·汤普逊Ken Thompson于1992ねん建立こんりゅう現在げんざいやめけい標準ひょうじゅんためRFC 3629。UTF-8就是以8为单もと对UCS进行编码,而UTF-8使用しよう大尾たいびじょ小尾おびじょてき形式けいしきまい使用しようUTF-8もうかそんてきじょりょうだいいちぶしがい,其餘ぶしてきあたま兩個りゃんこもと以"10"開始かいし使つかい文字もじ處理しょりのう夠較かい找出ごとてき開始かいし位置いち

ただしためりょうあずか以前いぜんてきASCII碼相よう(ASCIIためいちもとくみ),いん此UTF-8選擇せんたくりょう使用しよう可變長かへんちょうぶしもうかそんUnicode:

注意ちゅうい论是Unicode (Table 3.7) [12],还是ISO 10646 (10.2 UTF-8) [13]目前もくぜんただ规定りょう最高さいこう码位0x10FFFFてきもとてき编码。下表かひょうちゅう表示ひょうじだい于0x10FFFFてきUTF-8编码符合ふごう标准てき。)

Unicode UTF-8 これ间的转换关系ひょう ( x 表示ひょうじ码点うらないすえてき )
码点てきすう 码点おこり 码点终值 序列じょれつ Byte 1 Byte 2 Byte 3 Byte 4 Byte 5 Byte 6
  7 U+0000 U+007F 1 0xxxxxxx
11 U+0080 U+07FF 2 110xxxxx 10xxxxxx
16 U+0800 U+FFFF 3 1110xxxx 10xxxxxx 10xxxxxx
21 U+10000 U+1FFFFF 4 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
26 U+200000 U+3FFFFFF 5 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
31 U+4000000 U+7FFFFFFF 6 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
  • ざいASCII碼的範圍はんいよういちもとくみ表示ひょうじちょうASCII碼的範圍はんい就用もとくみ表示ひょうじ,這就形成けいせいりょうわが們上めんいたてきUTF-8てき表示ひょうじ方法ほうほう,這樣てきこうしょとうUNICODEぶんけんちゅうただゆうASCII碼時,もうかそんてきぶんけんためいちもとくみ所以ゆえん就是普通ふつうてきASCIIぶんけんこと讀取よみとてき時候じこう也是如此,所以ゆえんのうあずか以前いぜんてきASCIIぶんけんしょうよう
  • だい於ASCII碼的,就會よし上面うわつらてきだい一位元組的前幾位表示該unicodeもとてきちょう如110xxxxxぜん三位的二進位表示告訴我們這是個2BYTEてきUNICODEもと;1110xxxxこれさんてきUNICODEもと類推るいすい;xxxてき位置いちよしへん碼數てき二進製表示的位填入。こしもたれみぎてきx具有ぐゆうえつしょうてき特殊とくしゅ意義いぎただよう最短さいたんてきあし夠表たち一個字符編碼數的多字節串。注意ちゅういざいぶしくしちゅうだい一個字節的開頭"1"てきすうもく就是せいくしちゅうぶしてきすうもく

ASCII字母じぼ繼續けいぞく使用しよう1ぶしもうかそんじゅうおと文字もじまれ臘字ははある西里にしざとなんじ字母じぼとう使用しよう2ぶしらいもうかそん,而常用じょうようてき漢字かんじ就要使用しよう3ぶし辅助平面へいめんもとのり使用しよう4ぶし

ざいUTF-8+BOM格式かくしきぶんけんてきひらきくび,很多放置ほうちいちU+FEFF(UTF-8以EF,BB,BF代表だいひょう),以顯示けんじ這個文字もじ檔案以UTF-8へん碼。

UTF-8てき特性とくせい

编辑
UTF-8圖表ずひょう說明せつめい
UTF-8
最小さいしょう码位 0000
最大さいだい码位 10FFFF
まい节所うらないすう 8 bits
Byte order N/A
まい个字最小さいしょう节数 1
まい个字最大さいだい节数 4
  • UCSU+0000いたU+007F(ASCII)へん碼為ぶし0x00いた0x7F(ASCIIけんよう),這也意味いみちょただ包含ほうがん7ASCIIてきぶんけんざいASCIIUTF-8りょうしゅへん碼方しきいちようてき
  • 所有しょゆう>U+007FてきUCSへん碼為一個多個字節的串,まいぶしゆう標記ひょうきしゅうよし此,ASCIIぶし(0x00-0x7F)不可能ふかのう作為さくいにんなん其他てきいち部分ぶぶん
  • 表示ひょうじASCIIてきぶしくしてきだい一個字節總是在0xC0いた0xFDてき範圍はんいうらなみ指出さしで這個包含ほうがん多少たしょうぶしぶしくしてき其餘ぶしざい0x80いた0xBF範圍はんいうら,這使とくおもしんどう非常ひじょう容易よういなみ使へん碼無國界こっかい,且很しょう受丟しつぶしてき影響えいきょう
  • 編入へんにゅう所有しょゆう可能かのうてき231個いっこUCSだい
  • UTF-8へん碼字理論りろんじょう以最いた6ぶしちょうしか而16BMP最多さいたただよういた3ぶしちょう
  • Bigendian UCS-4ぶしくしてき排列はいれつ順序じゅんじょあずかていてき
  • ぶし0xFE0xFFざいUTF-8へん碼中したがえもちいいた同時どうじ,UTF-8以位もとぐみためへん單元たんげん,它的もとくみ順序じゅんじょざい所有しょゆう系統けいとうなかいちようてきぼつゆうもとくみじょてき問題もんだい,也因此它實際じっさいじょう并不需要じゅようBOM
  • あずかUTF-16ある其他Unicodeへん碼相たい於不支持しじUnicodeXMLてき系統けいとう,UTF-8さら容易ようい造成ぞうせい問題もんだい

UTF-8へん碼的ゆうてん

编辑

总体らい说,ざいUnicodeくしちゅう不可能ふかのうよし码点数量すうりょう决定显示它所需要じゅようてき长度,あるもの显示くしきさきざいぶんほん缓冲ちゅうひかり标应该放置ほうちてき位置いち;组合、变宽字体じたい不可ふか印字いんじ从右いたりひだりてき文字もじ其归いん

所以ゆえんつきかんざいUTF-8くしちゅうもと数量すうりょうあずか码点数量すうりょうてき关系UTF-32さら为复杂,ざい实际ちゅう很少かいぐういたゆう不同ふどうてきじょうがた

さら詳細しょうさいてきせつ,UTF-8へん具有ぐゆう以下いかいくてんゆうてん

  • ASCIIUTF-8てきいちしゅうよし为一个纯ASCIIくし也是いち个合法的ほうてきUTF-8くし所以ゆえん现存てきASCIIぶんほん需要じゅよう转换。为传统的扩展ASCIIしゅう设计てき软件通常つうじょう以不经修あらためある很少おさむあらため就能あずかUTF-8いちおこり使用しよう
  • 使用しよう标准てきめんこう节的はいじょれいほど对UTF-8はいじょはた产生あずかもと于Unicodeだい码点はいじょしょうどうてき结果。(つきかん这只ゆう有限ゆうげんてき有用ゆうようせいいん在任ざいにんなん特定とくてい语言ある文化ぶんかふと可能かのうゆう仍可接受せつじゅてき文字もじ排列はいれつ顺序。)
  • UTF-8UTF-16扩展标记语言ぶん档的标准编码。所有しょゆう其它编码必须どおり过显しきあるぶんほん声明せいめいらい指定してい[1]页面そん档备份そん互联网档あん
  • にんなにめんこうてきくし搜索そうさく算法さんぽう以用于UTF-8てきすうすえただよう输入仅由かんせいてきUTF-8组成)。ただし,对于包含ほうがん记数てきせい则表达式ある其它结构必须小心しょうしん
  • UTF-8くし以由一个简单的算法可靠地识别出来。就是,一个字符串在任何其它编码中表现为合法的UTF-8てき可能かのうせい很低,并随くし长度ぞう长而减小。举例说,もと值C0,C1,F5いたりFF从来ぼつゆう现。为了さらこのみてきもたれせい使用しようせい则表达式らい统计ほう过长がえだい值(以查W3 FAQ: Multilingual Forms页面そん档备份そん互联网档あんじょうてき验证UTF-8くしてきせい则表达式)。
  • あずかUCS-2てき比較ひかく:ASCIIてん换成UCS-2,ざいへん碼前插入そうにゅういち0x0。よう這些へん碼,かい含括いち些控せい如"ある '/',這在UNIXいち些C函數かんすうちゅうしょうかいさんせい嚴重げんじゅう錯誤さくごよし此可以肯定こうてい,UCS-2不適合ふてきごう作為さくいUnicodeてき外部がいぶへん碼,也因此誕せいりょうUTF-8。

UTF-8 へん碼的缺點けってん

编辑

へんうつし不良ふりょうてき解析かいせき

编辑

如果いち个 UTF-8 解析かいせきうつしとく很差(并且あずかとうぜん标准てき版本はんぽんけんよう),么它接收せっしゅういたいち些伪 UTF-8 时会はた其转换成せい确实则错误的 Unicode 输出。处理八位表示的校验例程可能遗漏一些信息。

不利ふり于正则表达式检索

编辑

せい则表达式以进ぎょう很多だか级的英文えいぶん模糊もこ检索。れい如,[a-h]表示ひょうじ a いた h 间所有しょゆう字母じぼ

どう样 GBK 编码的中てきちゅう文也ふみや以这样利用りようせい则表达式如在ただ知道ともみち一个字的读音而不知道怎么写的情况下,也可ようせい则表达式检索,いん为 GBK 编码按读おんはいじょてきただし Unicode 汉字按读おんはいじょてき所以ゆえん不利ふり于用せい则表达式检索。虽然せい则表达式检索并未こう虑中ぶんてき音字おんじただしよし于中ぶんてき音字おんじ数量すうりょうしょう音字おんじ还是同音どうおん不同ふどう调类がたてき音字おんじ所以ゆえんだい多数たすうじょう况下せい则表达式检索还可以接受せつじゅてき过 Unicode 汉字按部首ぶしゅはいじょいん此在ただ知道ともみち一個字的部首而不知道如何發音的情况下,UTF-8 可用かようせい则表达式检索而 GBK くだり

可能かのう無法むほうようきゅうてき C げんはこしき讀寫

编辑

よし於UTF-8ざいへん碼中可能かのうゆうちょそらもと(null character,U+0000),這會しるべ致Cげんはこしめせ以及其延伸えんしんてきほどしき解析かいせき失敗しっぱいいんため這些きゅうゆうてきほどしき使用しよう這個元來がんらい標記ひょうきくしてき結束けっそくしか而,これ所以ゆえんせつ可能かのう」,いんため這個もとひかえせいもと理論りろんじょうかい現在げんざい XML ひとしじゅん文字もじ檔案ちゅうとう萬不得已要使用空字元的時候,可能かのうてき解決かいけつ方法ほうほう考慮こうりょ使用しよう Java てき變種へんしゅUTF-8 ——使用しよう 0xc0 0x80 らいへん碼空もと

其他

编辑

UTF-8 てき ASCII もとただうらないよういち个字节,较节しょうそら间,ただしさらもとてき UTF-8 へん碼佔ようてき空間くうかん就要1/2,特別とくべつちゅうぶんにち文和ふみかずかんぶんCJK)這樣てきかたかたまり文字もじ,它们だい需要じゅようさん个字节。

UTF-8てき生物せいぶつ

编辑

Windows

编辑

雖然標準ひょうじゅんただし許多きょたWindowsほどじょ包括ほうかつWindows记事ほんざいUTF-8へん碼的檔案てきひらきくび加入かにゅういち段位だんいもとぐみくしEF BB BF。這是もとぐみ順序じゅんじょ記號きごうU+FEFFてきUTF-8へん結果けっかたい於沒ゆうあずかよう處理しょりUTF-8てき文字もじ編輯へんしゅうかずりゅうらんかい顯示けんじなりISO-8859-1くし

Posixけい

编辑

Posixけい统明确不けん议使用字ようじ节序掩码EF BB BF[14]いん为很ぶん本文ほんぶんけんもち以 “#!”(Shebang)开头指示しじよう运行てきほどじょ。Linuxけい统选择使用しようUnicode规范形式けいしきNormalization Form C(NFC),そく优先使用しよう预组そう(precomposed character)而非组合序列じょれつ(combining character sequence)。

2002ねん9がつ发布てきRed Hat Linux 8.0ざい开始正式せいしきだい多数たすう区域くいき设置てきだま认编码设为UTF-8。此前かく种语げんてきただし节编码为ぬし。2004ねん9がつSuSE Linux 9.1开始,かけしょう编码迁移为UTF-8。

くし处理时,使用しようUTF-8あるlocale赖的节编码情がた使用しようC语言wchar_tてき宽字固定こてい宽度编码,よう慢1いたり2个数量すうりょう级。[14]

ざい通常つうじょう用法ようほうJavaほどじょ语言ざいどおりInputStreamReaderOutputStreamWriter读取うつしにゅうくしてき时候支持しじ标准UTF-8。ただし,Java也支持しじ一种非标准的变体UTF-8,きょう对象てき序列じょれつJava本地ほんじ界面かいめんかずざいclassぶんけんちゅうてき嵌入かんにゅう常数じょうすう使用しようてきmodified UTF-8

變種へんしゅUTF-8

编辑

标准變種へんしゅてきUTF-8ゆう两个同点どうてんだいいちそら(null character,U+0000)使用しようそう节的0xc0 0x80,而不单字节的0x00。这保证了ざいやめ编码くしちゅうぼつゆう嵌入かんにゅうそら节。よしC语言とう语言ほどじょちゅう,单字节空ようらい标志くし结尾てきとうやめ编码くしいた这样てき语言ちゅう處理しょり,一个嵌入的空字符将把字串一刀两断。

だい个不同点どうてん基本きほんぶんしゅ平面へいめんこれ外字がいじてき编码てき方法ほうほうざい标准UTF-8ちゅう,这些使用しよう4节形しき编码,而在修正しゅうせいてきUTF-8ちゅう,这些UTF-16一样首先表示为代理对(surrogate pairs),しかきさきさいぞうCESU-8样按あきら代理だいり对分别编码。这样修正しゅうせいてき原因げんいんさら微妙びみょう。Javaちゅうてき为16长,いん此一些Unicode需要じゅよう两个Javaらい表示ひょうじ。语言てき这个せい质蓋りょうUnicodeてきぞう补平めんてき要求ようきゅうつきかん如此,ためりょうよう保持ほじ良好りょうこうてきこうきさきけんようよう改變かいへん也不容易よういりょう。这个修正しゅうせいてき编码系統けいとう证了一个已编码字串可以一次编为一个UTF-16码,而不いちいち个Unicode码点。不幸ふこうてき,这也意味いみUTF-8ちゅう需要じゅよう4节的ざい變種へんしゅUTF-8ちゅう变成需要じゅよう6节。

いん为變しゅUTF-8并UTF-8,所以ゆえんよう户在交换しんいき使用しよう互联网的时候需要じゅようとく注意ちゅうい不要ふよう误把變種へんしゅUTF-8とうなりUTF-8すうすえ

Mac OS X

编辑

Mac OS X操作そうさけい使用しようすべ一碼正規形式中的分解式標準等價(canonically decomposed Unicode),ざいぶんけんけいちゅう使用しようUTF-8编码进行文こうぶんけん命名めいめい,這做ほう通常つうじょうしょう为UTF-8-MAC。分解ぶんかいしき標準ひょうじゅん等價とうかちゅう,预组あい禁止きんし使用しようてき,必须以组合だい

这种方法ほうほう使ぶん类变どく非常ひじょう简单,ただしかい搞混使用しよう预组あい为标なぞらえ、组合ようらい显示特殊とくしゅてき软件。Macけい统的这种NFDすうすえこれ統一とういつ正規せいき形式けいしき(Unicode normalization)てきいち种格しき。而其けい统,包括ほうかつWindowsLinux使用しよう統一とういつ碼规范的NFC形式けいしき,也是W3C标准使用しようてき形式けいしき所以ゆえん通常つうじょうNFDすうすえ必须转换なりNFC才能さいのう其他平台ひらだいあるもの网络使用しよう

苹果りんご开发しゃ专区ゆう关于此问题的讨论:Apple Q&A 1173页面そん档备份そん互联网档あん)。

MySQL编码集中しゅうちゅうゆう两套UTF-8编码实现:“utf8”かず“utf8mb4”,其中“utf8”一个字最多占据3そら间的编码实现;而“utf8mb4”则是一个字最多占据4节空间的编码实现,也就UTF-8てきかんせい实现。这是よし于MySQLざい4.1版本はんぽん开始支持しじUTF-8编码(とう参考さんこうUTF-8草案そうあん版本はんぽんRFC 2279)时,为2003ねん,并且ざい同年どうねん9がつげんせいりょう其实现的UTF-8编码てきそら间占よう最多さいた为3节,而UTF-8正式せいしき形成けいせい标准ぶん档(RFC 3629其之きさききりせいUTF-8编码实现てき编码そら间占よう一般いっぱん认为こう虑到すうすえ库文けん设计てきけんようせい读取さい优化,ただし实际じょう并没ゆう达到目的もくてき,而且ざいUTF-8编码开始现需ようそんにゅう基本きほんぶん种平めんてきUnicodeれいemoji)时导致无ほうそんいれゆかり于3节的实现ただのうそんにゅう基本きほんぶん种平めん内的ないてき)。ちょくいた2010ねんざい5.5版本はんぽん推出“utf8mb4”らい代替だいたい、“utf8”じゅう命名めいめい为“utf8mb3”并调せい“utf8”为“utf8mb3”てき别名,并不けん使用しようきゅう“utf8”编码,以此修正しゅうせい遗留问题。[15][16][17][18]

まいり

编辑

参考さんこう文献ぶんけん

编辑
  1. ^ 1.0 1.1 Davis, Mark. Unicode over 60 percent of the web. Official Google Blog. 2012-02-03 [2019-11-23]. (原始げんし内容ないようそん于2018-08-09). 
  2. ^ Pike, Rob. UTF-8 history. 2003-04-30 [2019-11-23]. (原始げんし内容ないようそん于2006-10-29). ...UTF-8 was designed, in front of my eyes, on a placemat in a New Jersey diner one night in September or so 1992...So that night Ken wrote packing and unpacking code and I started tearing into the C and graphics libraries. The next day all the code was done... .
  3. ^ Pike, Rob; Thompson, Ken. Hello World or Καλημέρα κόσμε or こんにちは 世界せかい (PDF). Proceedings of the Winter 1993 USENIX Conference. 1993 [2019-11-23]. (原始げんし内容ないようそん (PDF)于2017-10-11). 
  4. ^ Encoding Standard. encoding.spec.whatwg.org. [2019-11-23]. (原始げんし内容ないようそん档于2015-02-04) えい语). The problems outlined here go away when exclusively using UTF-8, which is one of the many reasons that is now the mandatory encoding for all things. 
  5. ^ Usage Survey of Character Encodings broken down by Ranking. w3techs.com. [2019-11-23]. (原始げんし内容ないようそん于2022-01-21) えい语). 
  6. ^ Historical trends in the usage of character encodings. [2019-11-14]. 
  7. ^ UTF-8 Usage Statistics. BuiltWith. [2011-03-28]. (原始げんし内容ないようそん于2021-12-07). 
  8. ^ Using International Characters in Internet Mail. Internet Mail Consortium. 1998-08-01 [2007-11-08]. (原始げんし内容ないようそん于2007-10-26). 
  9. ^ Specifying the document's character encoding, HTML5.2, World Wide Web Consortium, 14 December 2017 [2018-06-03], (原始げんし内容ないようそん于2019-06-13) 
  10. ^ 參考さんこうRFC 2277 section 3.1
  11. ^ Using International Characters in Internet Mail. 2007-10-26 [2018-07-27]. 原始げんし内容ないようそん档于2007-10-26. 
  12. ^ The Unicode Standard, Version 13.0, Chapter 3 (PDF). [2020-03-23]. (原始げんし内容ないようそん (PDF)于2021-09-20). 
  13. ^ ISO 10646标准载页めん. [2020-03-23]. (原始げんし内容ないようそん于2022-01-19). 
  14. ^ 14.0 14.1 UTF-8 and Unicode FAQ for Unix/Linux by Markus Kuhn. [2005-06-16]. (原始げんし内容ないようそん于2018-09-24). 
  15. ^ MySQL :: MySQL 8.0 Reference Manual :: 10.9.3 The utf8 Character Set (Alias for utf8mb3). dev.mysql.com. [2020-04-03]. (原始げんし内容ないようそん于2021-10-31). 
  16. ^ MySQL :: MySQL 8.0 Reference Manual :: 10.9.2 The utf8mb3 Character Set (3-Byte UTF-8 Unicode Encoding). dev.mysql.com. [2020-04-03]. (原始げんし内容ないようそん于2022-01-13). 
  17. ^ MySQL :: MySQL 8.0 Reference Manual :: 10.9.1 The utf8mb4 Character Set (4-Byte UTF-8 Unicode Encoding). dev.mysql.com. [2020-04-03]. (原始げんし内容ないようそん于2021-10-25). 
  18. ^ Hooper, Adam. In MySQL, never use “utf8”. Use “utf8mb4”.. Medium. 2019-08-19 [2020-04-03]. (原始げんし内容ないようそん于2020-11-30) えい语). 

外部がいぶ連結れんけつ

编辑

ゆかり統一とういつ聯盟れんめい出版しゅっぱんてきしょ

编辑
  • The Unicode Standard, Version 5.0, Fifth Edition, The Unicode Consortium, Addison-Wesley Professional,2006ねん10がつ27にちISBN 0-321-48091-0
  • The Unicode Standard, Version 4.0, The Unicode Consortium, Addison-Wesley Professional,2003ねん8がつ27にちISBN 0-321-18578-1