php漢字のピンイン

3708 ワード

Unicode
起源と発展
Unicodeは、従来の文字符号化方式の限界を解決するために生じたものであり、例えばISO 8859で定義された文字は、異なる国で広く用いられているが、異なる国間では互換性がない場合が多い.多くの従来の符号化方式には、コンピュータがバイリンガル環境(通常ラテン文字およびそのローカル言語を使用する)を処理することを許容するが、マルチ言語環境を同時にサポートできないという共通の問題がある(複数の言語の混合を同時に処理できる場合を指す)
文字処理において、統一符号は、字形ではなく文字ごとに一意の符号(すなわち整数)を定義する.すなわち、統合コードは、抽象的な方法(すなわち、数字)で文字を処理し、ウェブブラウザやワープロなどの視覚的な演繹作業(例えば、フォントサイズ、外観形状、フォント形態、文体など)を他のソフトウェアに残して処理する.
現在、ほとんどのコンピュータシステムは基本アルファベットをサポートしており、それぞれ異なる他の符号化方式をサポートしています.Unicodeはそれらと互いに互換性があるため、その最初の256文字はISO 8859-1で定義された文字に保持され、既存の西欧語系文字の変換に特別な考慮を必要としない.また、同じ文字を多数繰り返し異なる文字に編成することで、従来の複雑な符号化方式とUnicode符号化との間で情報を失うことなく、直接変換することができる.
Unicodeのコード
統一コードの符号化方式はISO 10646の汎用文字セット概念に対応する.現在実用化されている統一コードバージョンはUCS-2に対応し,16ビットの符号化空間を用いている.つまり、1文字あたり2バイトを占有します.このように理論的には65536文字まで表すことができる.基本的に様々な言語の使用を満たす.実際には、現在のバージョンの統合コードは、この16ビット符号化を完全に使用するのではなく、特別な使用または将来の拡張として多くのスペースを保持しています.
上記16ビットの統一符号文字は、基本的な多文種平面を構成する.最新の統合コードバージョンでは、少なくとも21ビットの符号化空間を占める必要があり、3バイトよりやや少ない16の補助平面が定義されています.しかし、実際には補助平面文字は依然として4バイトの符号化空間を占有し、UCS-4と一致している.
インプリメンテーションモード
Unicodeの実現方式は符号化方式とは異なる.1文字のUnicode符号化は決定されます.しかし,実際の伝送過程では,異なるシステムプラットフォームの設計が必ずしも一致しないため,Unicode符号化の実現方式が空間節約の目的で異なる.Unicodeの実現方式をUnicode変換フォーマット(Unicode Transformation Format、略称UTF)と呼ぶ
例えば、基本的な7ビットのASCII文字のみを含むUnicodeファイルの場合、各文字が2バイトの元のUnicode符号化伝送を使用する場合、その最初のバイトの8ビットは常に0である.これは比較的大きな浪費をもたらした.この場合、基本7ビットのASCII文字を7ビット符号化で表すUTF-8符号化を用いることができる(先頭補0).他のUnicode文字と混合された場合、一定のアルゴリズムで変換され、各文字は1~3バイト符号化され、トップが0または1で識別されます.これにより、7ビットのASCII文字を主とする西洋語ドキュメントの符号化長が大幅に節約されます.同様に,今後出現する4バイトの補助平面文字や他のUCS−4拡張文字に対しても,2バイト符号化UTF−16は一定のアルゴリズムで変換する必要がある.
UTF-8
UTF-8(8-bit Unicode Transformation Format)は、Unicodeに対する可変長文字符号化であり、プレフィックス符号でもある.Unicode規格の任意の文字を表すために使用でき、その符号化の最初のバイトはASCIIと互換性があり、これにより、ASCII文字を処理していたソフトウェアは、一部の変更を必要とせず、使用を継続することができます.そのため、電子メール、Webページ、その他のファイルを格納または転送するアプリケーションで優先的に採用される符号化となっている.
UTF-8は、1~4バイトを使用して各バイトをエンコードします.
  • ,128個のUS-ACSCII文字には1文字の符号化しか必要ない(Unicode範囲はU+0000からU+007 Fまで)
  • .
  • 付加記号付きラテン語、ギリシャ語、シリル文字、アルメニア語、ヘブライ語、アラビア語、シリア語およびそのアルファベットは2バイトの符号化(Unicode範囲はU+0080からU+07 FF)
  • を必要とする
  • 他の基本的な多言語平面(BMP)の文字(これはほとんどの常用語を含む)は、3バイト符号化
  • を用いる.
  • 他の使用が極めて少ないUnicode補助平面の文字は4バイト符号化
  • を用いる.
    UTF-8符号化バイトの意味
  • UTF-8符号化の任意のバイトBについて、Bの1番目のビットが0の場合、BはASCII符号であり、Bは独立して1文字(範囲:00000000-01111111、対応10進数0-127)を表す
  • Bの第1のビットが1、第2のビットが0の場合、Bは複数のバイトで表される非ASCII文字の1バイトであり、文字の第1のバイト符号化(範囲:1000000-101111111、10進数128-191に対応)
  • ではない
  • Bの最初の2桁が1、3桁が0の場合、Bは非ASCII文字(複数バイトで表される)の最初のバイトであり、2バイト(110,000,000-1101111、10進数192-223に対応する)の
  • Bの3番目のビットが1、4番目のビットが0の場合、Bは非ASCII文字(複数のバイトで表される)の1バイトであり、3バイト(範囲:11100000-110111111、対応10進数224-239)の
  • である.
  • Bの4番目のビットが1、5番目のビットが0の場合、Bは非ASCII文字(複数のバイトで表される)の1番目のバイトであり、4つのバイト(範囲:11110000-11111101111、10進数240-247)の
  • 文字列をutf-8で単一の符号化配列に分割する
        public static function strSplitPhp5Utf8 ($str)
        {
            // place each character of the string into and array
            $split = 1;
            $array = array();
            for ($i = 0; $i < strlen($str);) {
                $value = ord($str[$i]);
                //   UTF-8             
                if ($value > 127) {
                    if ($value >= 192 && $value <= 223)
                        $split = 2;
                    elseif ($value >= 224 && $value <= 239)
                        $split = 3;
                    elseif ($value >= 240 && $value <= 247)
                        $split = 4;
                } else {
                    $split = 1;
                }
                $key = null;
                for ($j = 0; $j < $split; $j ++, $i ++) {
                    $key .= $str[$i];
                }
                array_push($array, $key);
            }
            return $array;
        }