テキストエンコーディング


テキストエンコーディング
テキストコードという問題は3年前から私を困らせていた.当時はPythonで多言語を処理していたときに発生したバグで、最後に問題は解決したが、その具体的な論理は分からなかった.それからばらばらに多くの資料に接触して、大体理解して、以下のように記録します.
unicodeとasciiなどの符号化スキーム
ascii
ascii符号化方式は全部で128文字対応のバイナリ表現を規定し、1バイトの後7 bitのみを占有し、最上位は0 である.
欧州諸国では128個の記号がすべてのアルファベットを表すのに十分ではなく、最高位を使用している.従って、異なる国128~255は異なる記号を表し、ISO-8859-1~15を含む拡張されたasciiコードとして汎用されていない.これらはすべて単一バイト符号化です.
ISO-8859-1
ISO-8859-1に収録されている文字はASCIIに収録されている文字のほか、西欧語、ギリシャ語、タイ語、アラビア語、ヘブライ語に対応する文字記号も含まれている.ユーロ記号の出現は比較的遅く、ISO-8859-1にはが収録されていない.
ISO-8859-1の符号化範囲は1バイト内のすべての空間を使用し、ISO-8859-1をサポートするシステムで他の符号化されたバイトストリームを転送および格納することはから放棄されない.
Latin 1はISO-8859-1の別名で、Latin-1 と書く環境もあります.

gb2312
6763個の漢字を含む2バイト符号化
gbk
gb 2312の拡張は、21003個の漢字を表すことができ、gb 2312 と互換性がある.
gb18030
unicodeの一種の天朝実現単一、デュアル、4バイト符号化を採用し、gb 2312 と互換性がある.
base64
base 64は、64個の印刷可能文字を用いてバイナリデータを表す.各ユニットには6 bitが含まれています.変換後、76セルごとに改行を付けます.
印刷可能文字には、A-Z a-z 0-9と、+ / として実装される2つの他の不定記号が含まれる.
3文字ごとに4ユニットに符号化し、3つ未満のものは=でを補う.
unicode
unicodeはすべての文字を表現しようとした.
unicodeを採用するシステム、プラットフォームは以下の通りである.
Windows NTおよび後続システム、javaはutf 16を内蔵符号化として採用する
.net,mac,kdeもunicode を使用
utf-8はunix-likeオペレーティングシステムの主なストレージ符号化スキームである.
utf-8はhtmlファイルで最もよく使われるunicode符号化である.
XMLおよびそのサブセットXHTMLは、標準ワードセットとしてUTF-8を採用する

コーディングスキーム
各文字に1つのコードポイントが規定されています:code point unicodeは現在、17個の平面を含み、各平面には最大65536文字を格納することができ、すなわち、すべての符号点を表すのに少なくとも21ビットが必要である.17個の平面の符号ビットは、U+xx 0000からU+xxFFFFとして表すことができ、xxは、0016から1016までの16進数値、合計17個の平面を表す.
最初の256文字コードはISO-8559-1と同じ表示方式はU+で16進数に続く.基本平面(BMP U+0000~U+FFFF)には4個の数字(2 byte)を用いる、16個の補助平面(SMP U+10000~U+10 FFFF)には5~6個の数字を用いる.

実装シナリオ
インプリメンテーションには、Unicode Transformation Format(UTF)とUniversal Coded Character Set(UCS)の2つのが含まれる.
unicodeの実現方式をUnicode変換フォーマット(Unicode Transformation Format、略称UTF)と呼ぶ.
utf 8:8 bit変長符号化、詳細実装は次節を参照
utf 16:16 bit変長符号化、以下詳述utf 32:32 bit定長符号化、unicode に完全対応
USc-2:2 byte定長符号化,utf 16のサブセット,JavaScriptはこの符号化スキームを用いる.より多くの文字を表すことができないため、その後utf 16 に発展した.
usc-4:utf 32 に等価
gb18030

utf16
BMPの文字は2 byteで表し、SMPは4 byte で表す.
BMPのU+D 800からU+DFFまでの間の符号ビット区間は、Unicode文字へのマッピングを永久に保持する.
補助平面の文字ビットは2^20個あり、すなわち、これらの文字に対応するには少なくとも20個のバイナリビットが必要である.UTF-16はこの20ビットを半分に分割し、上位10ビットはU+D 800からU+DFF(空間サイズ2^10)にマッピングされ、上位10ビットはU+DC 00からU+DFF(空間サイズ2^10)にマッピングされ、下位(L)と呼ばれる.これは、1つの補助平面の文字が、2つの基本平面の文字表現に分解されることを意味する.
2バイトについて、その符号点がU+D 800からU+DFFの間にあることを発見すると、後続の2バイトの符号点は、U+DC 00からU+DFFの間にあるべきであり、この4バイトは一緒に解読しなければならないと断定できる.

utf8
1~4個のbyteを用いるunicodeを符号化し、各ワードは1 byteのみであり、バイト順の問題は存在しない.
unicodeとutf 8符号化対応関係
  0000 0000-0000 007F | 0xxxxxxx
  0000 0080-0000 07FF | 110xxxxx 10xxxxxx
  0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
  0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
1バイト文字の最大有効ビットは常に0です.
マルチバイトシーケンスの最初のワードメタグループのいくつかの最高有効ビットは、シーケンスの長さを決定する.最大有効ビット110は2バイトシーケンスであり、1110は3バイトシーケンスであり、このように類推される.
マルチバイトシーケンスの残りのバイトの最初の2つの最大有効ビットは10 である.
具体的にはなぜこのような面倒なルールに基づいて符号化されるのでしょうか.1つは復号化の曖昧さを防止することであり,2つは記憶空間をできるだけ圧縮することである.符号化理論や情報論を学んだことがあるなら、簡単に理解できるはずだ.

utf 16に対して
utf 16は符号化効率/性能が高く、文字からバイトへの変換がより便利である.
utf 8の消費メモリ容量が少ない
テキストとIO
IOの場合、テキストを符号化または符号化するフォーマット変換がしばしば必要となる.
ハードディスク(HDD)ファイル:をファイルエンコード形式で格納する.
メモリ内:javaとc#用utf 16 画面に表示する方法:グラフィックスドライバ(仮想デバイス)入力バイトおよびエンコードレンダリングネットワーク:アプリケーション層が合意したプロトコルに従ってを符号化する
utf 8とBOM
BOMとは
BOM(byte order mark)は、バイトシーケンス(byte order)をマークするためにUTF-16およびUTF-32のために用意される.
utf異なる符号化実装のBOM定義:
UTF-8  EF BB BF
UTF-16(大端順)FE FF UTF-16(小端順)FF FE UTF-32(大端順)00 00 FE FF UTF-32(小端順)FF FE 00 00
utf 8については、バイト順の議題はありません.UTF-8符号化されたバイト順タグは、UTF-8のファイルであることを示すために使用される.バイト順を説明するのではなく、UTF-8のファイルを表示するためにのみ使用されます.
utf 16およびutf 32については、大端または小セグメントを表す.
BOMは魔数(magic number)に相当する
画像ファイル、ELFファイル、classファイルともに魔数が存在する
linuxコマンドfileは、マジック数(libmagic)に基づいてファイルタイプを判断することができる.
ファイル拡張子のより重要な役割は、Windowsシステムのexeファイルが実行可能ファイルであるなど、ユーザーがこのファイルを開きたいときにどのソフトウェアで実行するかを決定することです.docファイルはデフォルトでMicrosoft Wordで開いているWordファイルです.

メモ帳の4種類の名前を付けて保存する符号化フォーマット
ANSI(英語系、すなわちASCII符号化、中国語系はGB 2312またはBig 5符号化)「Unicode」(UTF-16 LE対応)「Unicode big endian」(UTF-16 BE対応)「UTF-8」:BOM付きUTF-8 utf 8を使用してBOMを含まない
BOMを含まないUTF-8が標準形式であり、UTF-8ファイルにBOMを置くのは主にマイクロソフトの習慣である(ちなみにBOM付きの小端序UTF-16を「Unicode」と呼び詳細は説明せず、これもマイクロソフトの習慣である).マイクロソフトがUTF-8でBOMを使用しているのは、UTF-8やASCIIなどのコードを明確に区別できるためですが、このようなファイルはWindows以外のオペレーティングシステムでは問題になります.
多くのwindowsプログラム(メモ帳を含む)は、UTF-8ファイルにバイト順にタグを追加します.しかしながら,クラスUnixシステムでは,この法則は推奨されていない.shellスクリプトの先頭のような重要なコードの正確な処理を妨げるためです.プログラミング言語が認識できないことにも影響します.
リファレンス
wiki:BOM wiki:Unicode
転載は作者を明記してください:Focustc、ブログの住所はhttp://blog.csdn.net/caozhkをクリックして開く