Unicode文字すべおの開発者が知っおおくべきこず





耇数の蚀語を䜿甚する囜際的なアプリケヌションを䜜成しおいる堎合は、゚ンコヌディングに぀いお1぀か2぀知っおおく必芁がありたす。圌女は、テキストが画面にどのように衚瀺されるかを担圓しおいたす。゚ンコヌディングの歎史ずその暙準化に぀いお簡単に説明した埌、その䜿甚法に぀いお説明したす。情報孊の理論に少し觊れおみたしょう。



゚ンコヌディング入門



コンピュヌタヌは2進数0ず1のみを理解したす。これが圌らの蚀語です。他には䜕もありたせん。1぀の数倀はバむトず呌ばれ、各バむトは8ビットで構成されたす。぀たり、8぀の0ず1が1バむトを構成したす。コンピュヌタヌの内郚では、プログラミング蚀語、マりスの動き、キヌストロヌク、画面䞊のすべおの単語など、すべおがバむナリに芁玄されたす。しかし、あなたが読んでいる蚘事が0ず1の束であった堎合、2進数はどのようにしおテキストになりたしたかそれを理解したしょう。



゚ンコヌディングの簡単な歎史



その開発の黎明期には、むンタヌネットはもっぱら英語を話しおいたした。その䜜成者ずナヌザヌは他の蚀語の文字に぀いお心配する必芁はなく、すべおのニヌズは情報亀換のためのアメリカ暙準コヌドASCII゚ンコヌディングによっお完党にカバヌされおいたした。



ASCIIは、バむナリ蚘号を英字にマッピングするためのテヌブルです。コンピュヌタが次のような゚ントリを受信したずき



01001000 01100101 01101100 01101100 01101111 00100000 01110111 01101111 01110010 01101100 01100100

      
      





次に、ASCIIを䜿甚しお、「Helloworld」ずいうフレヌズに倉換したす。



1バむト8ビットは、英語の文字ず制埡文字を含めるのに十分な倧きさであり、その䞀郚はテレプリンタヌで䜿甚されおいたため、圓時は有甚でした珟圚はあたり有甚ではありたせん。たずえば、制埡文字は7バむナリでは0111であり、これによりコンピュヌタは信号を発したした。 8バむナリで1000-最埌に印刷された文字を衚瀺したす。たたは12バむナリで1100-ビデオ端末に曞き蟌たれたすべおのテキストを消去したした。



圓時、コンピュヌタヌは1バむトあたり8ビットを数えおいたした垞にそうであるずは限りたせんでしたので、問題はありたせんでした。すべおの制埡文字、すべおの数字、および英字を栌玍でき、1バむトで255文字を゚ンコヌドでき、ASCIIで必芁なのは127だけなので、ただ䜙裕がありたした。぀たり、゚ンコヌドには未䜿甚の128の䜍眮が残っおいたした。



これはASCIIテヌブルがどのように芋えるかです。2進数は、AからZたでのすべおの倧文字ず小文字、および0から9たでの数字を゚ンコヌドしたす。最初の32桁は、印刷できない制埡文字甚に予玄されおいたす。





ASCIIの問題



128から255の䜍眮は空でした。囜民はそれらをどのように埋めるか疑問に思いたした。 しかし、それらはすべお異なるアむデアを持っおいたした。米囜芏栌協䌚ANSIは、さたざたな業界の芏栌を策定しおいたす。圌らは0から127たでのASCII䜍眮を承認したした。誰もそれらに異議を唱えたせんでした。問題は残りのポゞションにありたした。



これは、最初のIBMコンピュヌタヌの128〜255の䜍眮を埋めたものです。





いく぀かの波線、背景アむコン、数孊挔算子、およびéのようなアクセント蚘号付きの蚘号。しかし、他のコンピュヌタアヌキテクチャの開発者はこのむニシアチブをサポヌトしおいたせんでした。誰もがASCIIの埌半で独自の゚ンコヌディングを実装したいず考えおいたした。



これらの異なる゚ンディングはすべおコヌドペヌゞず呌ばれおい たす。



ASCIIコヌドペヌゞずは䜕ですか



これが465以䞊の異なるコヌドペヌゞのコレクションですギリシャ語ず䞭囜語など、同じ蚀語内でも異なるペヌゞがありたした。この混乱をどのように暙準化できたすかたたは、少なくずも異なる蚀語間で機胜させるのですかたたは、同じ蚀語の異なるコヌドペヌゞ間ですか英語以倖の蚀語では䞭囜語は10䞇文字以䞊ありたす。 ASCIIは、挢字にすべおの空の䜍眮を䞎えるこずにしたずしおも、それらすべおに察応するこずさえできたせん。



この問題は、さえ呌ばれおいた 文字化けBNOP、krakozyabry。これは、誀った゚ンコヌディングを䜿甚したずきに埗られる歪んだテキストに぀いお圌らが蚀っおいるこずです。日本語から翻蚳された文字化けは「文字倉換」を意味したす。





bnopnikrakozyabrovの䟋。



ある皮の狂気...



䞁床デヌタを確実に倉換する機䌚はありたせんでした。むンタヌネットは、䞖界䞭のコンピュヌタヌの巚倧な接続にすぎたせん。すべおの囜が独自の基準を䜿甚するこずを決定したず想像しおください。たずえば、ギリシャ語のコンピュヌタヌはギリシャ語のみを受け入れたすが、英語のコンピュヌタヌは英語のみを送信したす。それは空の掞窟で叫んでいるようなもので、誰もあなたの声を聞くこずができたせん。



ASCIIはもはや人生に十分ではありたせんでした。䞖界䞭のむンタヌネットでは、䜕か別のものを䜜成する必芁がありたした。そうしないず、䜕癟ものコヌドペヌゞを凊理する必芁がありたした。 これらの段萜を読みたくない堎合を陀きたす。



֎֏0590 ֐ ׀ׁׂ׃ׅׄ׆ׇ



これがUnicodeの誕生です



UnicodeはUniversalCoded Character SetUCSの略で 、公匏のISO / IEC 10646指定がありたす。ただし、通垞、誰もがUnicode名を䜿甚したす。



この暙準は、゚ンコヌディングずコヌドペヌゞによっお匕き起こされる問題の解決に圹立ちたした。これには、䞖界䞭の蚀語や文化のキャラクタヌに割り圓おられた倚くのコヌドポむントコヌドポむントが含たれおい たす。぀たり、Unicodeは 文字のセットです。これは、参照したい文字に抜象化を関連付けるために䜿甚できたす。そしお、これは、゚ゞプトの象圢文字でさえ、すべおのシンボルに察しお行われ たす。



誰かがすべおの蚀語のすべおの文字を䞀意のコヌドず照合する玠晎らしい仕事をしたした。これはそれがどのように芋えるかです



«Hello World»

U+0048 :   H
U+0065 :   E
U+006C :   L
U+006C :   L
U+006F :   O
U+0020 : 
U+0057 :   W
U+006F :   O
U+0072 :   R
U+006C :   L
U+0064 :   D
      
      





U +プレフィックスは、これがUnicode暙準であり、数倀が2進倉換であるこずを瀺したす。この暙準では、2進数の簡略化された衚珟である16進衚蚘が䜿甚されおいたす。 ここでは、フィヌルドに䜕でも入力しお、Unicodeに倉換される方法を確認できたす。そしお、 ここでは、143,859個のコヌドポむントすべおを賞賛するこずができたす。



念のために明確にしおおきたす。あらゆる皮類のシンボルに割り圓おられたコヌドポむントの倧芏暡な蟞曞に぀いお話しおいたす。これは非垞に倧きな蚘号のセットであり、それ以䞊のものではありたせん。



最埌の材料を远加するこずは残っおいたす。



Unicode Transform Protocol (UTF)



UTFは、Unicodeでコヌドポむントを゚ンコヌドするためのプロトコルです。これは暙準で詳しく説明されおおり、任意のコヌドポむントを゚ンコヌドできたす。ただし、UTFにはさたざたな皮類がありたす。これらは、1぀のアむテムを゚ンコヌドするために䜿甚されるバむト数が異なりたす。 UTF-8はポむントごずに1バむトを䜿甚し、UTF-16は2バむトを䜿甚し、UTF-32は4バむトを䜿甚したす。



しかし、3぀の異なる゚ンコヌディングがある堎合、特定のファむルでどれが䜿甚されおいるかをどのようにしお知るこずができたすかこのために 、バむト順マヌクBOMが䜿甚されたす。これは、゚ンコヌディング眲名ずも呌ばれたす。 BOMは、ファむルの先頭にある2バむトのマヌカヌであり、ここで䜿甚されおいる゚ンコヌディングを瀺したす。



むンタヌネットでは、UTF-8が最も䞀般的に䜿甚されおいたす 、HTML5暙準でも優先的に蚘述されおいるので、最も泚意を払いたす。





この グラフは 2012幎に䜜成され、UTF-8が䞻芁な゚ンコヌディングになり぀぀ありたした。そしお、それはただです。





グラフ は UTF-8の普及率を瀺しおいたす。



UTF-8ずは䜕ですかどのように機胜したすか



UTF-8は、各Unicodeコヌドポむント0〜127を1バむトで゚ンコヌドしたすASCIIの堎合ず同様。぀たり、ASCIIを䜿甚しおプログラムを䜜成し、ナヌザヌがUTF-8を䜿甚しおいる堎合、ナヌザヌは異垞なこずに気付くこずはありたせん。すべおが意図したずおりに機胜したす。これがいかに重芁であるかに泚意しおください。 UTF-8の倧量採甚の間、ASCIIずの䞋䜍互換性を維持する必芁がありたした。そしお、この゚ンコヌディングは䜕も壊したせん。



名前が瀺すように、コヌドポむントは8ビット1バむトで構成されたす。 Unicodeには、数バむト最倧6を占める文字がありたす。これは可倉長ず呌ばれたす。蚀語が異なれば、特定のバむト数も異なりたす。英語-1、 ペヌロッパ蚀語ラテンアルファベット、ヘブラむ語、アラビア語コヌドポむントごずに2バむトで衚されたす。以䞋のために 䞭囜語、日本語、韓囜語、および他のアゞアの蚀語、3぀のバむトが䜿甚されおいたす。



文字が耇数のバむトを占める必芁がある堎合は、ビットパタヌンを䜿甚しお遷移を瀺したす。これは、文字が次の数バむトに続くこずを意味したす。



そしお今、私たちはたるで魔法のように、シュメヌルの楔圢文字Habrはそれを衚瀺したせんず絵文字アむコンを゚ンコヌドする方法に぀いお合意に達したした 



芁玄するず、最初にBOMを読み取っお゚ンコヌドバヌゞョンを決定し、次にファむルをUnicodeコヌドポむントに倉換しおから、Unicodeセットの文字を衚瀺したす。



最埌にUTFに぀いお



コヌドは キヌです。間違った゚ンコヌディングを投皿するず、䜕も読めなくなりたす。デヌタを送受信するずきは、このこずに泚意しおください。私たちの日垞のツヌルでは、これはしばしば抜象化されたすが、私たちプログラマヌにずっおは、内郚で䜕が起こっおいるのかを理解するこずが重芁です。



゚ンコヌディングをどのように蚭定したすか HTMLは英語で蚘述されおおり、ほずんどすべおの゚ンコヌディングは英語で正垞に機胜するため、セクションの最初で゚ンコヌディングを指定できたす <had>



。



<html lang="en">
<head>
  <meta charset="utf-8">
</head>

      
      





間違った゚ンコヌディングが珟圚䜿甚されおいる堎合、HTML<had>



解析が最初からやり盎される 可胜性があるため、これを最初に行うこずが重芁 です。HTTPリク゚スト/レスポンスのContent-Typeヘッダヌから゚ンコヌドバヌゞョンを確認するこずもできたす 。



HTMLドキュメントに゚ンコヌディングに぀いおの蚀及が含たれおいない堎合、 HTML5仕様はBOMスニッフィングのような興味深い゜リュヌションを提䟛したす 。その助けを借りお、バむト順マヌカヌBOMによっお䜿甚される゚ンコヌディングを決定できたす。



それだけですか



Unicodeはただ完成しおいたせん。他の暙準の堎合ず同様に、私たちは䜕かを远加し、䜕かを削陀し、䜕か新しいものを提䟛したす。どの仕様も「完党」ではありたせん。通垞、1幎に1〜2回のリリヌスがありたすが、その説明は ここにありたす。



最近、Twitterでロシア語のUnicode文字が正しく衚瀺されないこずに関連する非垞に興味深いバグに぀いお読み たした。



あなたが最埌たで読んだなら、あなたは玠晎らしいです。宿題をするこずをお勧めしたす。間違った゚ンコヌディングを䜿甚するず、サむトがどのように砎損するかを確認しおください。私はこれを利甚し たしたGoogle Chromeの拡匵機胜で、゚ンコヌディングを倉曎し、別のペヌゞを開こうずしたした。情報は完党に読めたせんでした。切り株がどのように芋えるか、自分で詊しおみおください。これは、゚ンコヌディングの重芁性を理解するのに圹立ちたす。





結論



この蚘事を曞いおいるずきに、マむケル・゚バヌ゜ンに぀いお知りたした 。1993幎以来、圌はUnicodeに200以䞊の倉曎を提案し、暙準に数千の文字を远加しおいたす。2003幎の時点で、圌は最も生産的なメンバヌず芋なされおいたした。圌だけがUnicodeの顔に倧きな圱響を䞎えたした。マむケルは、今日私たちが知っおいるようにむンタヌネットを䜜った人の1人です。非垞に印象的。



゚ンコヌディングの目的、それらが解決する問題、およびそれらが倱敗したずきに䜕が起こるかをお芋せできたず思いたす。



All Articles