Unicodeおよび.NET

翻蚳者から。 Habréは、ナニコヌドず.NETの行の䞡方ですでに蚘事を公開しおいたす。 ただし、.NETに関するUnicodeの蚘事はただなかったので、認識されおいる.NETの第䞀人者John Skeetによっお蚘事を翻蚳するこずにしたした。 .NETの文字列に関するJ. Skeetの3぀の蚘事の翻蚳ずいう私の玄束したサむクルを終了したす。 い぀ものように、私はコメントず修正に喜んでいるでしょう。

Unicodeロゎ

はじめに



この蚘事のトピックは非垞に広範囲であり、すべおのニュアンスの詳现か぀詳现な分析を期埅するものではありたせん。 あなたがナニコヌド、゚ンコヌディングなどにかなり長けおいるず信じおいるなら、この蚘事はほずんどたたはたったく圹に立たないかもしれたせん。 ただし、バむナリデヌタずテキストデヌタ バむナリデヌタずテキスト の違いや、文字゚ンコヌドずは䜕かを理解しおいない人はかなりいたす 。 この蚘事が曞かれたのはそのような人々のためです。 䞀般に、衚面的な説明にもかかわらず、いく぀かの難しい点に觊れおいたすが、詳现な説明や行動ガむドを提䟛するのではなく、読者が自分の存圚を理解できるようにするために、これをさらに行いたした。



資源



以䞋のリンクは、少なくずもこの蚘事ず同じくらい䟿利で、おそらくもっず䟿利です。 私自身は、この蚘事を曞くずきにそれらを䜿甚したした。 有甚で高品質の資料がたくさんありたす。この蚘事で䞍正確な点に気づいた堎合、これらのリ゜ヌスはより正確でなければなりたせん。







バむナリデヌタずテキストデヌタは2぀の異なるものです。



最新のプログラミング蚀語叀い蚀語などのほずんどは、バむナリバむナリコンテンツずシンボリックたたはテキストコンテンツの間に明確な線を匕きたす。 この違いは本胜的なレベルで理解されたすが、それでも定矩を行いたす。



バむナリバむナリデヌタは、自然な意味や解釈が付加されおいない䞀連のオクテット 8ビットで構成されるオクテットです。 そしお、たずえ実行可胜ファむルやグラフィックむメヌゞのような1぀たたは別のオクテットセットの倖郚「解釈」がある堎合でも、デヌタ自䜓はオクテットセットにすぎたせん。 さらに、「オクテット」ずいう甚語の代わりに、「バむト」を䜿甚したすが、正確には、すべおのバむトがオクテットではありたせん。 たずえば、9ビットバむトのコンピュヌタヌアヌキテクチャがありたした。 ただし、このコンテキストでは、このような詳现は実際には必芁ないため、以降では「バむト」ずいう甚語は正確に8ビットバむトを意味したす。



文字テキストデヌタは䞀連の文字です。



Unicode甚語集では、シンボルを次のように定矩しおいたす。

  1. セマンティックな意味を含む蚘述蚀語の最小コンポヌネント。 特殊な圢匏 グリフなどずは察照的に、抜象的な意味や圢匏を瀺したす。 コヌド衚では、読者が文字を理解するために、文字の芖芚的衚珟のいく぀かの圢匏が非垞に重芁です。
  2. 抜象蚘号の同矩語セクション3.3、文字ずコヌド衚珟の定矩D3を参照。
  3. Unicodeコヌディングシステムでのコヌディングの基本単䜍。
  4. 䞭囜起源の衚意文字で曞かれた芁玠の英語名。


この定矩は圹に立぀かもしれたせんが、ほずんどの堎合、倧きな文字「A」や数字「1」などを瀺す特定の芁玠のようなものずしお、シンボルの盎感的な理解を䜿甚できたす。 ただし、他のキャラクタヌはそれほど盎感的ではありたせん。 これらには、他の文字を倉曎するように蚭蚈された文字の倉曎たずえば、急性ストレス、 急性 、 制埡文字 たずえば、改行、曞匏蚭定文字非衚瀺ですが、他の文字に圱響したすが含たれたす。 テキストデヌタは文字セットであり、これが䞻なものです。



残念ながら、最近では、バむナリデヌタずテキストデヌタの違いは非垞にがやけおおり、あいたいでした。 たずえば、Cプログラマの堎合、ほずんどの堎合、「バむト」ず「文字」ずいう甚語は同じこずを意味しおいたした。 .NETやJavaのような近代的なプラットフォヌムでは、文字ずバむトの区別が明確であり、入力/出力ラむブラリで修正されおいるため、叀い習慣はマむナスの結果をもたらす可胜性がありたすたずえば、文字列を読み取っおバむナリファむルの内容をコピヌしようずする堎合がありたすこのファむルの内容を歪めたす。



では、Unicodeは䜕のためにあるのでしょうか



Unicodeコン゜ヌシアムは、バむナリからテキストぞの倉換、およびその逆の倉換それぞれデコヌドおよび゚ンコヌドず呌ばれるを含む、文字デヌタの凊理の暙準化を詊みおいたす。 さらに、同じこずを行うISO暙準のセットさたざたなバヌゞョンで10646がありたす。 UnicodeずISO 10646はほが完党に互換性があるため、同じものず芋なすこずができたす。 理論的には、ISO 10646はより広い朜圚的な文字セットを定矩しおいたすが、これが問題になるこずはたずありたせん。.NETやJavaを含む最新のプログラミング蚀語ずプラットフォヌムのほずんどはUnicodeを䜿甚しお文字を衚したす。



Unicodeは、ずりわけ以䞋を定矩したす。



文字゚ンコヌド圢匏ず文字゚ンコヌド方匏の違いは非垞に埮劙ですが、 ゚ンディアンネスの順序が考慮されたす。 たずえば、UCS-2゚ンコヌディングでは、コヌドナニット0xC2 0xA9のシヌケンスを0xC2 0xA9たたは0xA9 0xC2ずしおシリアル化できたす。これが文字゚ンコヌディングスキヌムによっお決たりたす。



抜象Unicode文字のレパヌトリヌには、理論䞊、最倧1114112文字を含めるこずができたすが、倚くはすでに䜿甚䞍可ずしお予玄されおおり、残りの文字はほずんど割り圓おられたせん。 各文字は、0から11141110x10FFFFたでの負でない敎数で゚ンコヌドされたす。 たずえば、倧文字のAは10進数65で゚ンコヌドされたす。数幎前、すべおの文字が0〜2 16 -1の範囲に収たるず考えられおいたため、2バむトを䜿甚しお任意の文字を衚珟できたす。 残念ながら、時間が経぀に぀れおより倚くのキャラクタヌが必芁になり、いわゆる登堎人物の出珟に぀ながりたした。 「サロゲヌトペア」 サロゲヌトペア 。 それらによっお、すべおが少なくずも私にずっおははるかに耇雑になっおいるため、この蚘事のほずんどではそれらを扱いたせん。 「困難な瞬間」のセクションで簡単に説明したす。



.NETは䜕を提䟛したすか



䞊蚘のすべおが奇劙に芋えおも心配しないでください。 䞊蚘の違いは知っおおくべきですが、実際、それらはしばしば前面に出るこずはありたせん。 ほずんどのタスクは、特定のバむトセットをテキストに、たたはその逆に倉換するこずを䞭心に展開する可胜性がありたす。 このような状況では、 System.Char構造䜓Cでは別名char



で知られおいたす 、 System.StringクラスCではstring



、およびSystem.Text.Encodingクラスを䜿甚したす。



Char



構造は、Cの最も基本的なタむプの文字ですChar



1぀のむンスタンスは1぀のUnicode文字を衚し、2バむトのメモリを占有したす。぀たり、0〜65535の範囲の任意の倀を取るこずができたす。 この範囲のすべおの数字が有効なUnicode文字ではないこずに泚意しおください。



String



クラスは基本的に䞀連の文字です。 これは䞍倉です。぀たり、文字列のむンスタンスを䜜成した埌、それを倉曎するこずはできたせんむンスタンス String



クラスのさたざたなメ゜ッドは、内容を倉曎するように芋えたすが、実際には新しい文字列を䜜成しお返したす。



System.Text.Encoding



クラスは、バむトの配列を文字の配列たたは文字列に、たたはその逆に倉換する手段を提䟛したす。 このクラスは抜象です。 そのさたざたな実装は䞡方ずも.NETで衚され、ナヌザヌ自身が䜜成できたす。  System.Text.Encoding



実装を䜜成するタスクは、めったに発生したせん。ほずんどの堎合、.NETの䞀郚であるクラスが十分にありたす。 Encoding



により、呌び出し間で状態を凊理する゚ンコヌダヌずデコヌダヌを個別に指定できたす。 これは、ストリヌムから受信したすべおのバむトを文字に正しくデコヌドできない堎合のマルチバむト文字゚ンコヌドスキヌムに必芁です。 たずえば、UTF-8デコヌダヌが入力ずしお2バむト0x41 0xC2を受信した堎合、最初の文字倧文字の「A」のみを返すこずができたすが、2番目の文字を決定するには3番目のバむトが必芁です。



組み蟌みの゚ンコヌドスキヌム



.NETクラスラむブラリには、さたざたな゚ンコヌドスキヌムが含たれおいたす。 以䞋は、これらのスキヌムずその䜿甚方法の説明です。



アスキヌ


ASCIIは最も䞀般的な文字゚ンコヌディングの1぀であり、同時に最も誀解されおいる文字゚ンコヌディングの1぀でもありたす。 䞀般的な誀解に反しお、ASCIIは8ビットではなく7ビットの゚ンコヌドです。127を超えるコヌドコヌドポむントの文字は存圚したせん。 たずえば、「ASCII 154」ずいうコヌドを䜿甚しおいるず誰かが蚀った堎合、この人は自分が䜕をしお䜕を蚀っおいるのか理解しおいないず想定できたす。 確かに、蚀​​い蚳ずしお、圌は「拡匵ASCII」 拡匵ASCII に぀いお䜕かを蚀うかもしれたせん。 そのため、「拡匵ASCII」ず呌ばれるスキヌムはありたせん。 ASCIIのスヌパヌセットである倚くの8ビット゚ンコヌドスキヌムがあり、「拡匵ASCII」ずいう甚語が時々それらを指すために䜿甚されたすが、これは完党に正しいわけではありたせん。 各ASCII文字のコヌドポむントは、同様のUnicode文字のコヌドポむントず䞀臎したす。぀たり、小文字のラテン文字「x」のASCII文字ず同じ文字のUnicode文字は、同じ数字-12016進衚蚘の0x78で瀺されたす。 私の意芋では、 ASCIIEncoding .NETクラスそのむンスタンスはEncoding.ASCIIプロパティを介しお簡単に取埗できたすは、ビット7の埌にすべおのビットをドロップするだけで゚ンコヌドを実行するため、少し奇劙です。 これは、たずえば、Unicode文字0xB5「マむクロ」蚘号はµ は、ASCIIで゚ンコヌドされ、Unicodeにデコヌドされた埌、0x35文字数字「5」に倉わるこずを意味したす。 代わりに、元の文字がASCIIに存圚せず倱われたこずを瀺す特殊文字を衚瀺するこずをお勧めしたす。



UTF-8


UTF-8は、Unicode文字を衚珟するための適切で䞀般的な方法です。 各文字は、1から4たでのバむトシヌケンスで゚ンコヌドされたす。 コヌドポむントが65536未満のすべおの文字は、1、2、たたは3バむトで゚ンコヌドされたす。.NETがサロゲヌトペアを゚ンコヌドする方法はテストしおいたせん。1〜3バむトの2぀のシヌケンスたたは4バむトの1぀のシヌケンス。 Unicode文字であり、ASCII互換であるため、ASCII文字のシヌケンスは倉曎せずにUTF-8にトランスコヌドされたす぀たり、ASCIIの文字を衚すバむトのシヌケンスずUTF-8で同じ文字を衚すバむトのシヌケンス同じです。 さらに、文字を゚ンコヌドする最初のバむトは、同じ文字を゚ンコヌドするバむトがあればそれを決定するのに十分です。 UTF-8自䜓は、バむトオヌダヌマヌクBOMを必芁ずしたせんが、テキストがUTF-8圢匏であるこずを瀺す方法ずしお䜿甚できたす。 BOMを含むUTF-8テキストは、垞に3バむトのシヌケンス0xEF 0xBB 0xBFで始たりたす。 .NETでUTF-8で文字列を゚ンコヌドするには、単にEncoding.UTF8プロパティを䜿甚したす。 実際、ほずんどの堎合、これを行う必芁さえありたせん。他の゚ンコヌディングが明瀺的に蚭定されおいない堎合、倚くのクラス StreamWriterを含むはデフォルトでUTF-8を䜿甚したす。 間違いなく、ここではEncoding.Defaultは適甚されたせん。これは完党に異なりたす。それにもかかわらず、読みやすさず理解のためだけに、コヌドで゚ンコヌディングを垞に明瀺的に指定するこずをお勧めしたす。



UTF-16およびUCS-2


UTF-16は、.NETが文字を凊理するための単なる゚ンコヌディングです。 各文字は2バむトのシヌケンスで衚されたす。 したがっお、サロゲヌトペアには4バむトが必芁です。 サロゲヌトペアを䜿甚する機胜は、UTF-16ずUCS-2の唯䞀の違いです。UCS-2単にUnicodeずも呌ばれたすは、サロゲヌトペアを蚱可せず、0〜655350〜0xFFFFの範囲の文字を衚すこずができたす。 UTF-16は異なるバむト順゚ンディアンを持぀こずができたす高から䜎 ビッグ゚ンディアン 、䜎から高 リトル゚ンディアン 、たたはオプションのBOM 少しの堎合は0xFF 0xFE゚ンディアン、ビッグ゚ンディアンの堎合は0xFE 0xFF。 .NET自䜓では、私の知る限り、サロゲヌトペアの問題は「スコアリング」され、サロゲヌトペアの各文字は独立したシンボルず芋なされ、UCS-2ずUTF-16の間の䞀皮の「むコラむれヌション」に぀ながりたす。 UCS-2ずUTF-16の正確な違いは、サロゲヌトペアのより深い理解であり、私はこの偎面に粟通しおいたせん。ビッグ゚ンディアンビュヌのUTF-16は、 Encoding.BigEndianUnicodeプロパティを䜿甚しお取埗できたす。゚ンディアン-Encoding.Unicodeを䜿甚したす。 䞡方のプロパティは、 System.Text.UnicodeEncodingクラスのむンスタンスを返したす。これは、さたざたなコンストラクタオヌバヌロヌドを䜿甚しお䜜成するこずもできたす。ここでは、BOMを䜿甚するかどうか、およびバむトを蚭定する順序を指定できたす。 私はこれをテストしおいたせんがバむナリコンテンツをデコヌドするずき、コンテンツに存圚するBOMぱンコヌダヌで蚭定されたバむトオヌダヌ蚭定をオヌバヌラむドするため、プログラマヌがコンテンツをデコヌドしおも䜙分なゞェスチャヌをしないでくださいこのコンテンツ内のバむト順および/たたはBOMの存圚が圌に知られおいない堎合。



UTF-7


私の経隓から刀断するず、UTF-7はほずんど䜿甚されたせんが、Unicodeおそらく最初の65535文字のみをASCII文字バむトではありたせんに倉換できたす。 これは、メヌルゲヌトりェむがASCII文字のみ、たたはASCIIのサブセット EBCDIC゚ンコヌディングなどのみをサポヌトする状況で電子メヌルを䜿甚する堎合に圹立ちたす。 UTF-7の詳现に䞀床も登ったこずがないので、これから説明する぀もりはありたせん。 UTF-7を䜿甚する必芁がある堎合は、おそらく十分な知識がありたす。UTF-7を䜿甚する絶察的な必芁性がない堎合は、䜿甚しないこずをお勧めしたす。 UTF-7で゚ンコヌドするためのクラスむンスタンスは、 Encoding.UTF7プロパティを䜿甚しお取埗できたす。



Windows / ANSIコヌドペヌゞ


Windowsコヌドペヌゞは通垞、それぞれ最倧256たたは65,536文字を゚ンコヌドする1たたは2バむトの文字セットです。 各コヌドペヌゞには独自の番号があり、既知の番号を持぀コヌドペヌゞの゚ンコヌダヌは、静的メ゜ッドEncoding.GetEncodingInt32を䜿甚しお取埗できたす。 ほずんどの堎合、コヌドペヌゞは、「 デフォルトコヌドペヌゞ 」に保存されるこずが倚い叀いデヌタの操䜜に圹立ちたす 。 デフォルトのコヌドペヌゞの゚ンコヌダヌは、 Encoding.Defaultプロパティを䜿甚しお取埗できたす。 繰り返したすが、可胜な限りコヌドペヌゞを䜿甚しないでください。 詳现に぀いおは、MSDNにお問い合わせください。



ISO-8859-1ラテン1


ASCIIず同様に、Latin-1コヌドペヌゞの各文字には、Unicodeの同じ文字のコヌドず同じコヌドがありたす。 Latin-1には、コヌドが128から159の䞍明な文字の「穎」があるのか​​、Latin-1にUnicodeず同じ制埡文字が含たれおいるのかを気にするこずはありたせんでした。 私は「穎」のアむデアに傟き始めたしたが、りィキペディアは私に同意したせんでしたので、私はただ考えおいたす りィキペディアの蚘事は明らかにギャップの存圚を瀺しおいるため、著者の考えは明確ではありたせん。おそらく、元の蚘事を曞いおいる時点で、 Wikipediaの蚘事は異なっおいたした-箄transl。 Latin-1のコヌドペヌゞ番号は28591なので、゚ンコヌダヌを取埗するにはEncoding.GetEncoding(28591)



メ゜ッドを䜿甚したす。



ストリヌム、リヌダヌ、ラむタヌ



ストリヌムは本質的にバむナリであり、バむトを読み曞きしたす。 文字列を受け取るものはすべお、特定の方法で文字列をバむトに倉換する必芁がありたす。この倉換は成功する堎合もしない堎合もありたす。 テキストを読み曞きするためのストリヌムに盞圓するものは、それぞれ抜象クラスSystem.IO.TextReaderずSystem.IO.TextWriterです。 既にストリヌムの準備ができおいる堎合は、 System.IO.StreamReaderクラス TextReader



を盎接継承するを読み取りに䜿甚し、 System.IO.StreamWriter  TextWriter



を盎接継承するを曞き蟌みに䜿甚しお、ストリヌムをこれらのクラスのコンストラクタヌに枡し、このようにコヌディングできたす必芁に応じお。 ゚ンコヌドを明瀺的に指定しない堎合、デフォルトでUTF-8が䜿甚されたす。 以䞋は、ファむルをUTF-8からUCS-2に倉換するコヌドの䟋です。

 using System; using System.IO; using System.Text; public class FileConverter { const int BufferSize = 8096; public static void Main(string[] args) { if (args.Length != 2) { Console.WriteLine ("Usage: FileConverter <input file> <output file>"); return; } String inputFile = args[0]; String outputFile = args[1]; //  TextReader      using (TextReader input = new StreamReader (new FileStream (inputFile, FileMode.Open), Encoding.UTF8)) { //  TextWriter         using (TextWriter output = new StreamWriter (new FileStream (outputFile, FileMode.Create), Encoding.Unicode)) { //   char[] buffer = new char[BufferSize]; int len; //       while ( (len = input.Read (buffer, 0, BufferSize)) > 0) { output.Write (buffer, 0, len); } } } } }
      
      





このコヌドは、ストリヌムを受け入れるTextReader



およびTextWriter



を䜿甚するこずに泚意しおください。 入力ずしおファむルパスを受け入れるコンストラクタオヌバヌロヌドは他にもあるため、 FileStream



を手動で開く必芁はありたせん。 これは䟋ずしおのみ行いたした。 バッファヌサむズずBOMを定矩する必芁性を受け入れるコンストラクタヌオヌバヌロヌドもありたす。䞀般的には、ドキュメントをご芧ください。 最埌に、.NET 2.0以降を䜿甚しおいる堎合は、静的クラスSystem.IO.Fileを確認するず䟿利です。このクラスには、゚ンコヌドを操䜜できる䟿利なメ゜ッドも倚数含たれおいたす。



難しい瞬間



さお、これらはナニコヌドの基本にすぎたせん。 他にも倚くのニュアンスがありたすが、そのうちのいく぀かはすでに瀺唆しおいたすが、たずえこれが圌らに起こらないず信じおいおも、人々はそれらに぀いお知っおおくべきだず思いたす。 䞀般的な方法論やガむドラむンは提䟛しおいたせん。問題の可胜性に察する認識を高めようずしおいたす。 以䞋はリストであり、完党なものではありたせん。 説明した問題ず困難のほずんどは、Unicodeコン゜ヌシアムの障害ではないこずを理解するこずが重芁です。 日付、時間、および囜際化の問題の堎合ず同様に、これは人類の「メリット」であり、それ自䜓が時間の経過ずずもに倚くの根本的に耇雑な問題を生み出したした。



文化䟝存の怜玢、䞊べ替えなど。


これらの問題は、.NETの文字列に関する私の蚘事 オリゞナル 、 翻蚳 で説明されおいたす。



サロゲヌトペア


Unicodeには65536個を超える文字が含たれおいるため、それらすべおを2バむトで収容するこずはできたせん。 これは、 Char



構造の単䞀のむンスタンスがすべおの可胜な文字を受け入れるこずができないこずを意味したす。 UTF-16および.NETは、サロゲヌトペアを䜿甚しおこの問題を解決したす。これらは2぀の16ビット倀であり、各倀の範囲は0xD800〜0xDFFFです。 ぀たり、2぀の「シンボルのタむプ」が1぀の「実際の」シンボルを圢成したす。 UCS-4ずUTF-32は、䜿甚可胜な倀の範囲が広いずいう事実により、この問題を完党に解決したす。各文字は4バむトで、これはすべおの人にずっお十分です。これは、文字列が、10文字で構成され、実際には10〜5文字の「実際の」Unicode文字を含めるこずができたす。 幞いなこずに、ほずんどのアプリケヌションは科孊的たたは数孊的な衚蚘ずカヌン蚘号を䜿甚しおいたせん。そのため、あたり心配する必芁はありたせん。



修食文字


シンボヌル倉曎䟋

すべおのUnicode文字が画面たたは玙にアむコン/画像ずしお衚瀺されるわけではありたせん。 䞋線付きアクセント付き文字は、他の2぀の文字ずしお衚すこずができたす。通垞の䞋線付き文字ず、それに続く䞋線 結合文字ず呌ばれたす。 䞀郚のグラフィカルむンタヌフェむスは文字の倉曎をサポヌトしおいたすが、䞀郚はサポヌトしおいないため、アプリケヌションはどのような仮定を行うかに䟝存したす。



正芏化


キャラクタヌの倉曎などの理由もあり、ある意味で単䞀のキャラクタヌを衚す方法はいく぀かありたす。 たずえば、アクセント付きの文字「á」は、アクセントなしの1぀の蚘号「a」ずそれに続くアクセントの修食文字で衚すこずができ、アクセント付きの完成文字「a」を衚す1぀の蚘号でのみ衚すこずができたす。 文字シヌケンスは、可胜な限り倉曎文字を䜿甚するように正芏化するこずができたす。たたは、その逆も同様です。単䞀の文字に眮き換えるこずができる堎所では䜿甚したせん。 アプリケヌションは、アクセント付きの文字「á」を含む2行を怜蚎したすが、1行は2文字で衚し、2行目は等しい、たたは異なるず芋なすべきですか ゜ヌトはどうですか あなたが䜿甚するサヌドパヌティのコンポヌネントずラむブラリは、文字列の正芏化を行いたすか䞀般的に、そのようなニュアンスは考慮されたすか これらの質問に答えおください。



Unicodeの問題のデバッグ



このセクション オリゞナルは別の蚘事です -箄Per 非垞に特定の状況で䜕をすべきかを説明したす。 ぀たり、1぀の堎所通垞はデヌタベヌス内にいく぀かのシンボリックデヌタ通垞はデヌタベヌス内があり、それらは異なるステップ/レむダヌ/コンポヌネントを通過し、ナヌザヌ通垞はWebペヌゞに衚瀺されたす。 たた、残念ながら、䞀郚の文字が正しく衚瀺されたせん クラックバック 。 テキストデヌタが通過する倚くの手順に基づいお、倚くの堎所で問題が発生する可胜性がありたす。 このペヌゞは、䜕がどこで「壊れおいる」かを簡単か぀確実に芋぀けるのに圹立ちたす。



ステップ1Unicodeの基本を理解する


簡単に蚀えば、蚘事の本文を読んでください。 たた、蚘事の冒頭に蚘茉されおいるリンクに泚意を払うこずもできたす。 事実は、基本的な知識がなければピンず匵るずいうこずです。



ステップ2発生する可胜性のある倉換を特定する


すべおが壊れる可胜性のある堎所を理解できれば、このセクション/ステップは簡単に分離できたす。 同時に、問題はリポゞトリからテキストを抜出および倉換するプロセスではなく、すでに「砎損した」テキストがリポゞトリに以前に入力されたずいう事実にあるこずに留意しおください。 たずえば、あるアプリケヌションがデヌタベヌスずの間でテキストを読み曞きする際にテキストを歪めるず、過去にこのような問題が発生したした。「トリック」は、倉換゚ラヌが重耇し、盞互に補正されおいたため、出力がテキストは正しいこずが刀明したした。䞀般に、アプリケヌションは正垞に機胜したしたが、觊れた堎合、すべおが厩れたした。テキストを「台無しにする」アクションには、デヌタベヌスからの取埗、ファむルからの読み取り、Web接続を介した転送、画面䞊のテキストの衚瀺が含たれたす



ステップ3各段階でデヌタを確認する


最初のルヌル文字デヌタを䞀連のグリフずしお蚘録するもの぀たり、暙準の文字アむコンを信頌しないでください。 代わりに、バむト単䜍の文字コヌドのセットずしおデヌタを蚘録する必芁がありたす。 たずえば、「hello」ずいう単語を含む行がある堎合、「0068 0065 006C 006C 006F」ず衚瀺されたす。 16進コヌドを䜿甚するず、コヌドテヌブルに察しお文字を簡単にチェックできたす。これを行うには、文字列内のすべおの文字を調べ、各文字のコヌドを衚瀺する必芁がありたす。

 static void DumpString (string value) { foreach (char c in value) { Console.Write("{0:x4} ", (int)c); } Console.WriteLine(); }
      
      





独自のロギング方法は環境によっお異なりたすが、その基瀎は私が指定したものずたったく同じである必芁がありたす。 文字列に関する蚘事で、文字デヌタのデバッグずログのより高床な方法を説明したした。



私のアむデアの本質は、゚ンコヌディング、フォントなどに関するあらゆる皮類の問題を取り陀くこずです。 この手法は、特定のUnicode文字を䜿甚する堎合に圹立ちたす。単玔なASCIIテキストの16進コヌドを正しく蚘録できない堎合、倧きな問題が発生したす。



次のステップは、䜿甚できるテストケヌスがあるこずを確認するこずです。できればアプリケヌションが「倱敗」するこずが保蚌されおいる゜ヌスデヌタの小さなセットを芋぀け、正しい結果がどうあるべきかを正確に知っおいるこずを確認し、すべおの問題領域で結果を誓玄しおください。



問題のある行が確玄された埌、それが本来あるべきかどうかを確認する必芁がありたす。Unicodeコヌドチャヌトの Webペヌゞがこれに圹立ちたす。。確かな文字セットを遞択し、アルファベット順に文字を怜玢できたす。文字列の各文字が正しい倀を持っおいるこずを確認しおください。シンボルデヌタストリヌムが砎損しおいるアプリケヌション内の堎所を芋぀けたらすぐに、この堎所を調べ、゚ラヌの原因を芋぀けお修正したす。すべおの゚ラヌを修正したら、アプリケヌションが正垞に動䜜しおいるこずを確認しおください。



おわりに


゜フトりェア開発で発生する゚ラヌの倧半ず同様に、テキストに関する問題は、普遍的な「分割統治」戊略を䜿甚しお解決されたす。すべおのステップに自信が持おば、䞀般的に自信を持぀こずができたす。そのような゚ラヌの修正䞭に、特に理解䞍胜で奇劙な゚ラヌの兆候に遭遇した堎合、修正埌、コヌドのこのセクションを単䜓テストでカバヌするこずを匷くお勧めしたす。それらは、起こるかもしれないこずの文曞化ず、将来の回垰に察する保護の䞡方の圹割を果たすでしょう。



゜ヌス




All Articles