すべおの開発者がテキストを操䜜するための゚ンコヌディングず文字セットに぀いお知っおおくべきこず

これは、すべおのプログラマがテキストを凊理するために゚ンコヌディングず文字セットに぀いお絶察に肯定的に知る必芁があるものの翻蚳の最初の郚分です



コンピュヌタヌでテキストを操䜜する堎合、゚ンコヌドに぀いお必ず知っおおく必芁がありたす。 メヌルを送信しおも。 たずえそれらを取埗するだけでも。 すべおの詳现を理解する必芁はありたせんが、少なくずも゚ンコヌディングが䜕であるかを知っおいる必芁がありたす。 そしお、ここに最初の良いニュヌスがありたす。この蚘事は少しわかりにくいかもしれたせんが、基本的な考え方は非垞にシンプルです。



この蚘事では、゚ンコヌドず文字セットに぀いお説明したす。





「Unicodeの絶察最小倀ず各開発者の文字セット䟋倖なし」ずいうタむトルのJoel Spolskyによる蚘事は良い入門蚘事であり、随時それを読み盎すこずは倧きな喜びです。 ゚ンコヌドの問題を理解するのに苊劎しおいる人たちに圌女を送るのは恥ずかしいですが、技術的な詳现に関しおはかなり軜いです。 この蚘事が、゚ンコヌドずは䜕か、そしお最も䞍芁な瞬間にすべおのテキストが砎損する理由を正確に知るこずを願っおいたす。 この蚘事は開発者䞻にPHPを察象ずしおいたすが、すべおのコンピュヌタヌナヌザヌがその恩恵を受けるこずができたす。



基本




誰もが倚かれ少なかれそれに぀いお聞いたこずがありたすが、議論に関しおはどういうわけか知識が消えおしたうので、ここに行きたす。コンピュヌタヌは文字、数字、写真などを保存できたせん。 圌はほんの少ししか芚えおいない。 ビットには2぀の意味しかありたせんYESたたはNO、TRUEたたはFALSE、1たたは0、たたは想像できる他のペア。 コンピュヌタヌは電気で動䜜するため、ビットは電荷で衚されたす。電荷があるかどうかはわかりたせん。 これを1ず0ずしお衚す方が簡単なので、これらの衚蚘法に固執したす。



ビットを䜿甚しお有甚なものを衚すには、ルヌルが必芁です。 ゚ンコヌドスキヌム、぀たり゚ンコヌドを䜿甚しお、ビットシヌケンスを文字、数字、画像に䌌たものに倉換する必芁がありたす。 このように、䟋えば



01100010 01101001 01110100 01110011

ビット




この゚ンコヌドでは、01100010は「b」、01101001は「i」、01110100は「t」、011110011は「s」です。 特定のビットシヌケンスは文字に察応し、文字は特定のビットシヌケンスに察応したす。 26文字のシヌケンスを蚘憶できる堎合、たたは適切な䞀臎をすぐに芋぀けるこずができる堎合は、本のようなビットを読むこずができたす。

䞊蚘の回路はASCIIず呌ばれたす。 れロず1の行は、8ビットバむトの郚分に分割されたす。 ASCII゚ンコヌドは、バむトを人間の文字に倉換するためのテヌブルを定矩したす。 この衚の䞀郚を次に瀺したす。



ビット文字



01000001 A

01000010 B

01000011 C

0100100 D

01000101 E

0 100 0110 F




A〜Zの文字、倧文字ず小文字、0〜9の数字、10個の句読点、アンパサンド、ドル蚘号などを含む95文字です。 たた、スペヌス、タブ、改行、文字リタヌンなどの33個の倀も含たれたす。 これらは印刷䞍可胜な文字ですが、それらは人に芋え、圌によっお䜿甚されたす。 テキストの開始コヌドや終了コヌドなど、䞀郚の倀はコンピュヌタヌにのみ有甚です。 ASCII゚ンコヌドには合蚈で128文字が含たれたす。これは、7ビット0000000から1111111たでのすべおの組み合わせを䜿甚するため、コンピュヌタヌを理解する人にずっおは完党な偶数です。



1ず0のみを䜿甚しお人間の文字列を衚す方法は次のずおりです。



01001000 01100101 01101100 01101100 01101111 00100000

01010111 01101111 01110010 01101100 01100100



「ハロヌワヌルド」





重芁な甚語




䜕かをASCIIで゚ンコヌドするには、右から巊に移動しお、文字をビットに眮き換えたす。 ビットを文字にデコヌドするには、衚を巊から右に向かっお、ビットを文字に眮き換えたす。



゚ンコヌド | enˈkōd |

verb [with obj。 ]

コヌド化された圢匏に倉換する

コヌド |kōd|

名詞

単語、文字、数字、たたは他の単語、文字などに代わる他の蚘号のシステム




コヌディングは他の䜕かの衚珟です。 ゚ンコヌドずは、あるビュヌを別のビュヌに倉換する方法を蚘述するルヌルのセットです。



明確化に倀する他の甚語



文字セット、文字セット、文字セット -゚ンコヌド可胜な文字セット。 「ASCII゚ンコヌドには128文字のセットが含たれたす。」 ゚ンコヌドの同矩語。



コヌドペヌゞは、ビットセットをシンボルに割り圓おるコヌドペヌゞです。 テヌブル。 ゚ンコヌドの同矩語。



文字列は、䞀緒に結合された䜕かの束です。 ビット文字列は、00011011などのビットの集たりです。文字列は、「This one」などの文字の集たりです。 シヌケンスの同矩語。



2進数、8進数、10進数、16進数




数字を曞く方法はたくさんありたす。 10011111は、8進数で237、10進数で159、16進数で9Fのバむナリ衚蚘です。 これらすべおの数倀の倀は同じですが、16進法は2進法よりも短く理解しやすいです。 この蚘事のバむナリシステムに固執しお、理解を深め、䜙分なレベルの抜象化を削陀したす。 他の衚蚘法で文字コヌドを満たしおも心配しないでください。すべおの倀は同等です。



蚀い蚳モむ




私たちは今話しおいるこずを知っおいるので、泚意しおください蚀語に関しおは95文字がかなり重芁です。 このセットは基本的な英語をカバヌしおいたすが、フランス語の文字はどうですか しかし、これはドむツ語のStraßen¬Ìbergangs¬Ànderungs¬gesetzですか そしおスりェヌデン語でsmörgÃ¥sbordぞの招埅は 䞀般に、機胜したせん。 ASCIIではありたせん。 é、ß、Ì、À、öのプレれンテヌションの仕様は、単に利甚できたせん。



「ちょっず埅っお」ずペヌロッパ人は蚀う。「バむトあたり8ビットの普通のコンピュヌタヌでは、ASCIIは垞に0のビットを䜿甚しない これを䜿甚しお、テヌブルをさらに128個の倀で拡匵できたす。 そしお、それはそのようなものでした。 しかし、ただ母音の音を瀺すにはあたりにも倚くの方法がありたす。 ペヌロッパ蚀語で䜿甚される文字ず意味のすべおの組み合わせが256゚ントリのテヌブルに収たるわけではありたせん。 そのため、䞖界は、文字のすべおのサブセットをカバヌする豊富な゚ンコヌディング、暙準、事実䞊の暙準、および暙準以䞋になりたした。 誰かがスりェヌデン語たたはチェコ語で文曞を曞く必芁があり、垌望する゚ンコヌディングを芋぀けられずに、別の゚ンコヌディングを発明したした。 たたは、すべおが起こったず思いたす。



ロシア語、ヒンディヌ語、アラビア語、韓囜語、および地球䞊の他の倚くの生きおいる蚀語を忘れないでください。 死者に぀いおは黙っおいたす。 耇数の蚀語を䜿甚しおドキュメントを䜜成する方法を芋぀けたら、䞭囜語を远加しおみおください。 たたは日本語。 䞡方ずも数千の文字が含たれおいたす。 たた、倀は256のみです。 どうぞ



マルチバむト゚ンコヌディング




256文字を超えるテヌブルを䜜成するには、1バむトでは䞍十分です。 65536個の異なる倀を゚ンコヌドするには、2バむト16ビットで十分です。 Big-5、たずえば2バむト゚ンコヌディング。 ビットシヌケンスを8のブロックに分割する代わりに、16ビットのブロックを䜿甚し、倧きな぀たり、倧マッチングテヌブルを含みたす。 メむンフォヌムのBig-5は、繁䜓字䞭囜語のほずんどの文字をカバヌしおいたす。 GB18030も同様の゚ンコヌドですが、繁䜓字䞭囜語ず簡䜓字䞭囜語の䞡方が含たれおいたす。 そしお、あなたが尋ねる前に、はい、簡䜓字䞭囜語専甚の゚ンコヌディングがありたす。 足りない



以䞋はテヌブルGB18030です。



ビット文字

10000001 01000000侂

10000001 01000001侄

10000001 01000010侅

10000001 01000011來

10000001 01000100䞏





GB18030は、ほずんどのラテン文字を含むかなり広い範囲の文字をカバヌしたすが、最終的には、これは他の倚くの文字の単なる別の゚ンコヌディングです。



Unicodeの混乱




その結果、この混乱に最もうんざりしおいる人は、すべおの゚ンコヌディングを組み合わせた単䞀の暙準を開発するずいうアむデアを埗たした。 Unicodeはその暙準になりたした。 文字ず蚘号のすべおのバリ゚ヌションに䜿甚される1,114,112ポむントの信じられないほどのテヌブルを定矩したす。 これは、人類が認識しおいるすべおのペヌロッパ、䞭倮アゞア、極東、南、北、西、先史時代および将来のシンボルをすべお゚ンコヌドするのに十分です。 Unicodeを䜿甚するず、コンピュヌタヌに入力できる任意の文字を䜿甚しお、任意の蚀語でドキュメントを䜜成できたす。 これは、Unicode時代以前は䞍可胜でしたが、非垞に困難でした。 暙準には、非公匏のクリンゎンセクションもありたす。 ナニコヌドは非垞に倧きく、非公匏のセクションを蚱可したす。



それでは、Unicodeぱンコヌドに䜕バむトを䜿甚したすか たったくありたせん 。 Unicodeぱンコヌドではないためです。

混乱した あなただけではありたせん。 Unicodeは䜕よりもたず、文字の項目のテヌブルを定矩したす。 これは、「65-A、66-B、9731-」ずいう蚀い方です冗談ではありたせん。 これらのアむテムがどのようにバむトに゚ンコヌドされるかは、別の䌚話の䞻題です。 1,114,112を衚すには2バむトでは䞍十分です。 3぀で十分ですが、3は奇劙な数なので、4は快適な最小倀です。 ただし、䞭囜語、たたぱンコヌドに倚数のビットを必芁ずする倚くの文字を含む別の蚀語を䜿甚するたで、4バむトの倪い゜ヌセヌゞを䜿甚するこずはありたせん。 「A」が000000000000000000000000 01000001で垞に゚ンコヌドされ、「B」が000000000000000000000000 01000010で゚ンコヌドされる堎合、この゚ンコヌドを䜿甚するドキュメントは4倍に膚れ䞊がりたす。



この問題を解決するにはいく぀かの方法がありたす。 UTF-32は、すべおの文字を32ビットセットに倉換する゚ンコヌドです。 これは単玔なアルゎリズムですが、倚くのスペヌスを無駄にしたす。 UTF-16およびUTF-8は可倉長゚ンコヌディングです。 文字が1バむトで゚ンコヌドできる堎合文字のアむテム番号が非垞に小さいため、UTF-8は1バむトで゚ンコヌドしたす。 2バむトが必芁な堎合は、2バむトが䜿甚されたす。 ゚ンコヌドは、珟圚の文字が゚ンコヌドされおいるビット数を䞊䜍ビットに䌝えたす。 この方法はスペヌスを節玄したすが、これらの信号ビットが頻繁に䜿甚される堎合にも䜿甚したす。 UTF-16は劥協です。すべおの文字は少なくずも2バむトですが、必芁に応じおサむズを4バむトに増やすこずができたす。



文字゚ンコヌドビット

UTF-8 01000001

UTF-16 00000000 01000001

UTF-32 000000000000000000000000 01000001

あUTF-8 11100011 10000001 10000010

あUTF-16 00110000 01000010

あUTF-32 0000000000000000 00110000 01000010





そしおそれだけです。 Unicodeは文字ず数字の巚倧なテヌブルであり、さたざたなUTF゚ンコヌディングがこれらの数字をビットに倉換する方法を決定したす。 䞀般に、Unicodeは単なる別のスキヌムです。 特別なこずは䜕もありたせん。圌女は、できる限りすべおをカバヌしようずしおいるだけです。 そしおそれは良いこずです。



アむテム




シンボルは、Unicodeポむントによっお識別されたす。 これらのアむテムは16進数で蚘述され、先頭に「U +」が付いおいたす䟿宜䞊、「これはUnicodeアむテムです」以倖の意味はありたせん。 蚘号には段萜U + 1E00がありたす。 他の10進数蚀葉で蚀えば、これはUnicodeテヌブルの7680番目の文字です。 正匏には「ラテン倧文字Aリング底付き」ず呌ばれたす。



ナむアシリル




䞊蚘の本質任意の文字は倚くの異なるビットシヌケンスで゚ンコヌドでき、ビットシヌケンスは䜿甚する゚ンコヌドに応じお異なる文字を衚すこずができたす。 その理由は、異なる゚ンコヌディングでは、文字ごずに異なるビット数ず異なる倀を䜿甚しお、異なる文字を゚ンコヌドするためです。



文字を゚ンコヌドするビット



11000100 01000010 Windows Latin 1ÄB

11000100 01000010 Mac RomanƒB

110100100 01000010 GB18030腂



ビットを゚ンコヌドする文字



FÞöWindows Latin 1 01000110 11111000 11110110

FÞöMac Roman 01000110 10111111 10011010

FÞöUTF-8 01000110 11000011 10111000 11000011 10110110





誀解、恥ずかしさ、問題




䞊蚘のすべおを持っおいるので、私たちは倚くのナヌザヌず開発者が毎日経隓する差し迫った問題、それらが䞊蚘にどのように関係するか、そしお解決策は䜕であるかに぀いお説明したす。 最倧の問題は



なぜ地獄は私のテキストが読めないのですか




ÉGÉìÉRÅ[ÉfÉBÉìÉOÇÕìÔǵÇ≠ǻǢ



文曞を開き、䞊蚘のテキストのように芋える堎合、理由は同じです。プログラムが゚ンコヌドず間違われおいたす。 そしおそれだけです。 ドキュメントは砎損しおいないため少なくずもただ、魔法は必芁ありたせん。 代わりに、正しい゚ンコヌドを遞択しおテキストを衚瀺するだけです。 䞊蚘の想定文曞にはビットが含たれおいたす



10000011 01000111 10000011 10010011 10000011 01010010 10000001 01011011

10000011 01100110 10000011 01000010 10000011 10010011 10000011 01001111

10000010 11001101 10010011 11101111 10000010 10110101 10000010 10101101

10000010 11001000 10000010 10100010





だから、すぐに゚ンコヌディングを掚枬したしたか 肩をすくめれば、あなたは正しい。 誰が知っおる

ASCIIで詊しおみたしょう。 これらのバむトのほずんどは1で始たりたす。正しく芚えおいれば、ASCIIは実際にはこのビットを䜿甚しおいたせん。 したがっお、ASCIIはオプションではありたせん。 UTF-8はどうですか ほずんどのバむトは、この゚ンコヌドでは有効な倀ではありたせん。 Mac Roman別のペヌロッパの゚ンコヌディングはどうですか うヌん、圌女にずっお、これらのバむトは正しい倀です。 10000011は「É」、「G」などにデコヌドしたす。 Mac Romanでは、テキストは次のようになりたす。ÉGÉGÉRÅ[ÉfÉBÉBÉOÇÕìÇÕµÇÕìÇÕ≠ǻǢ。 そうだね いや たぶん コンピュヌタヌはどのように知っおいたすか 誰かがそれを曞きたかったのかもしれたせん。 私の知る限り、これはDNAシヌケンスかもしれたせん それを解決したす。これはMac Romanであり、これはDNAです。



もちろん、これは完党なナンセンスです。 正解は次のずおりです。テキストは日本のShift-JISで゚ンコヌドされおおり、゚ンコヌディングは難しくないのように芋えるはずです。 誰が考えたでしょうか

テキストが読めない最初の理由は、誰かが間違った゚ンコヌディングで䞀連のバむトを読み取ろうずしおいるこずです。 コンピュヌタヌは垞にプロンプ​​トを衚瀺する必芁がありたす。 圌自身は掚枬したせん。 䞀郚の皮類のドキュメントはコンテンツの゚ンコヌディングを決定したすが、バむトシヌケンスは垞にブラックボックスのたたです。

ほずんどのブラりザは、特別なメニュヌ項目を䜿甚しおペヌゞ゚ンコヌディングを指定する機胜を提䟛したす。 他のプログラムにも同様のアむテムがありたす。



著者は、郚分に分けられおいたせんが、蚘事はすでに長いです。 数日で継続する。



All Articles