Unicodeについて
Unicode以前は、8ビットエンコーディングが広く使用されていましたが、その主な欠点は明らかです。
- 255文字のみで、そのうちのいくつかはグラフィックではありません。
- 作成されたエンコーディングではなくドキュメントを開く機能。
- フォントはエンコードごとに作成する必要があります。
そのため、すべての文字を含む「ワイド」エンコーディングの単一の標準を作成することが決定されました(最初は通常の文字のみを含めることを望んでいましたが、気が変わってエキゾチックな文字を追加し始めました)。 Unicodeは1,112,064コード位置(16ビット以上)を使用します。 先頭はASCIIを複製し、次にラテンアルファベット、キリル文字、およびその他のヨーロッパ文字とアジア文字の残りを複製します。 文字の指定については、最初の65kに「U + xxxx」という形式の16進表記を使用し、残りには多数の数字を使用します。
UTF-8について
ユニコードはあると思っていたが、UTF-8はある。 後で私は間違っていることがわかりました。
UTF-8は、8ビット形式のUnicodeの単なる表現です。 コードが128未満の文字は1バイトで表されます。UnicodeではASCIIが繰り返されるため、これらの文字のみで記述されたテキストはASCIIのテキストになります。 コードが128のシンボルは2バイトでエンコードされ、コードは2048-3、65536-4です。 したがって、6バイトに到達することは可能ですが、それらでエンコードすることはできません。
0x00000000-0x0000007F:0xxxxxxx 0x00000080-0x000007FF:110xxxxx 10xxxxxx 0x00000800-0x0000FFFF:1110xxxx 10xxxxxx 10xxxxxx 0x00010000-0x001FFFFF:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
UTF-8でのエンコード
手順は次のようなものです。
- 各文字をUnicodeに変換します。
- どの文字範囲をチェックしてください。
- 文字コードが128未満の場合、変更せずに結果に追加します。
- 文字コードが2048未満の場合、文字コードの最後の6ビットと最初の5ビットを取得します。 0xC0を最初の5ビットに追加してシーケンスの最初のバイトを取得し、0x80を最後の6ビットに追加して2番目のバイトを取得します。 連結して結果に追加します。
- 同様に、大きなコードでも続行できますが、U + FFFF以外の文字がUTF-16サロゲートを処理する必要がある場合。
Function EncodeUTF8(s) Dim i, c, utfc, b1, b2, b3 For i=1 to Len(s) c = ToLong(AscW(Mid(s,i,1))) If c < 128 Then utfc = chr( c) ElseIf c < 2048 Then b1 = c Mod &h40 b2 = (c - b1) / &h40 utfc = chr(&hC0 + b2) & chr(&h80 + b1) ElseIf c < 65536 And (c < 55296 Or c > 57343) Then b1 = c Mod &h40 b2 = ((c - b1) / &h40) Mod &h40 b3 = (c - b1 - (&h40 * b2)) / &h1000 utfc = chr(&hE0 + b3) & chr(&h80 + b2) & chr(&h80 + b1) Else ' UTF-16 utfc = Chr(&hEF) & Chr(&hBF) & Chr(&hBD) End If EncodeUTF8 = EncodeUTF8 + utfc Next End Function Function ToLong(intVal) If intVal < 0 Then ToLong = CLng(intVal) + &H10000 Else ToLong = CLng(intVal) End If End Function
UTF-8をデコード
- 11xxxxxxという形式の最初の文字を探しています
- 10xxxxxx形式の後続のすべてのバイトを読み取ります
- 2バイトのシーケンスと110xxxxxの形式の最初のバイトの場合、プレフィックスを切り捨てて追加し、最初のバイトに0x40を掛けます。
- 長いシーケンスでも同様です。
- シーケンス全体を目的のUnicode文字に置き換えます。
Function DecodeUTF8(s) Dim i, c, n, b1, b2, b3 i = 1 Do While i <= len(s) c = asc(mid(s,i,1)) If (c and &hC0) = &hC0 Then n = 1 Do While i + n <= len(s) If (asc(mid(s,i+n,1)) and &hC0) <> &h80 Then Exit Do End If n = n + 1 Loop If n = 2 and ((c and &hE0) = &hC0) Then b1 = asc(mid(s,i+1,1)) and &h3F b2 = c and &h1F c = b1 + b2 * &h40 Elseif n = 3 and ((c and &hF0) = &hE0) Then b1 = asc(mid(s,i+2,1)) and &h3F b2 = asc(mid(s,i+1,1)) and &h3F b3 = c and &h0F c = b3 * &H1000 + b2 * &H40 + b1 Else ' U+FFFF c = &hFFFD End if s = left(s,i-1) + chrw( c) + mid(s,i+n) Elseif (c and &hC0) = &h80 then ' s = left(s,i-1) + chrw(&hFFFD) + mid(s,i+1) End If i = i + 1 Loop DecodeUTF8 = s End Function
参照資料
ウィキペディアのユニコード
ASP + VBScriptのソース
UPD :エラーシーケンス処理およびInteger型のエラー。AscWを返します。