UTF-8:エンコードとデコード

UTF-8がどのように機能し、Unicodeが何であるかを把握する理由は、VBScriptにUTF-8を操作するための組み込み関数がないためです。 そして、何も機能していなかったので、私は銃を身に着けて/自分で仕上げなければなりませんでした。 とにかく私の意見の経験は役に立ちます。 理解を深めるために、理論から始めます。



Unicodeについて



Unicode以前は、8ビットエンコーディングが広く使用されていましたが、その主な欠点は明らかです。



そのため、すべての文字を含む「ワイド」エンコーディングの単一の標準を作成することが決定されました(最初は通常の文字のみを含めることを望んでいましたが、気が変わってエキゾチックな文字を追加し始めました)。 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でのエンコード



手順は次のようなものです。



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をデコード





 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を返します。



All Articles