JavaScriptのキャラクターセット:
JavaScriptプログラムは、Unicode文字セットを使用して記述されます。 UnicodeはASCIIとLATIN-1のスーパーセットであり、地球上のほぼすべての言語をサポートしています。 ECMAScript3では、JavaScriptがUnicode 2.1およびその後のバージョンをサポートする必要がありますが、ECMAScript5にはUnicode 3および後続のバージョンが必要です。だから、私たちはそれを書いた
JavaScriptプログラムはすべて、Unicodeを使用してエンコードされます。
UTF-8
UTF-8(UTF8-BIT Unicode Transformation Format)は、Unicodeの可変長文字エンコードであり、プレフィックスコードでもあります。
Unicode標準の任意の文字を表すために使用でき、そのエンコードの最初のバイトはASCIIと互換性があります。これにより、ASCII文字が元々処理していたソフトウェアが少量の変更なしで使用し続けることができるようになります。したがって、テキストを保存または送信するための電子メール、Webページ、その他のアプリケーションで徐々に優先エンコードになりました。
現在、ほとんどのWebサイトはUTF-8エンコーディングを使用しています。
JavaScriptによって生成されたUnicode-Encoded文字列をUTF-8エンコード文字列に変換する
タイトルで述べたように、アプリケーションシナリオは非常に一般的です。たとえば、サーバーにバイナリを送信する場合、サーバーはバイナリコンテンツのエンコードがUTF-8でなければならないことを規定しています。この場合、JavaScriptのUnicode文字列をプログラムを介してUTF-8エンコード文字列に変換する必要があります。
変換方法
変換の前に、Unicodeのエンコード構造が固定されていることを理解する必要があります。
信じられない場合は、CharCodeatの文字列法を試して、返されたCharcodeがいくつのバイトを使用するかを確認できます。
•英語は1文字を占有し、漢字は2文字を占有します
ただし、UTF-8のエンコード構造の長さは、単一の文字のサイズによって決定されます。
以下は、数バイトを占める単一の文字のサイズです。単一のユニコード文字後の最大長は6バイトです。
•1バイト:Unicodeコードは0-127です
•2バイト:Unicodeコードは128-2047です
•3バイト:Unicodeコードは2048-0xffffです
•4バイト:Unicodeコードは65536-0x1fffffです
•5バイト:Unicodeコードは0x200000-0x3ffffffです
•6バイト:Unicodeコードは0x4000000-0x7fffffffです
詳細については、写真をご覧ください。
英語と英語の文字のユニコードコードは0〜127であるため、UnicodeとUTF -8の英語の長さとバイトは同じであり、1バイトのみを占有します。これが、UTF8がUnicodeのスーパーセットである理由です!
漢字のユニコードコード間隔は0x2E80-0x9fffであるため、漢字について話し合いましょう。したがって、UTF8の漢字の長さは最大3バイトです。
では、漢字は2バイトのユニコードからUTF8の3バイトにどのように変換されますか?
漢字「中」をUTF-8エンコーディングに変換する必要があると仮定します
1.漢字のユニコード値サイズを取得します
var str = 'in'; var charcode = str.charcodeat(0); console.log(charcode); // => 20013
2。サイズに基づいてUTF8の長さを判断する
前のステップから、「in "in" Is 20013の漢字を取得します。20013は2048-0xffff間に位置しているため、中子文字が「UTF8の3バイト」を占めるはずです。
3。補完
漢字「私」は3バイトを占有する必要があることを知っているので、これらの3バイトをどのように取得できますか?
これには、補完コードを設計する必要があります。特定の補数コードロジックは次のとおりです。
わかりました、私はあなたがこの写真を理解できないことを知っているので、私はそれについて話します!
特定の塗りつぶしコードは次のとおりです。「x」は、塗りつぶしに使用される空きスペースを示します。
•0xxxxxxx
•110xxxxx 10xxxxxx
•1110xxxx 10xxxxxx 10xxxxxx
•11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
•111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
•1111110x 10xxxxxx 10xxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
警告:見つけましたか? Fillコードの最初のバイトは、UTF-8コード全体が占めるバイト数を示します!この機能は、Unicode〜にデコードされたUTF-8で使用されます
最初に簡単な例を見てみましょう。英語の文字「A」をUTF8エンコーディングに変換します。
1。「A」のcharcodeは65です
2。65は0-127の間の間隔にあるので、「a」は1つのバイトを占有します
3. UTF8の1つのバイトの補体は0xxxxxxxです。 xは空いている位置を表し、補数に使用されます。
4。65をバイナリに変換して1000001を取得します
5. 1xxxxxxの空室に1000001を前から後ろに追加し、01000001を取得します
6。11000001を文字列に変換して「A」を取得します
7。最後に、「A」はUTF8によってエンコードされます。
この小さな例では、UTF-8がUnicodeのスーパーセットであることをもう一度確認しましたか?
さて、中国語のキャラクター「ミドル」に戻りましょう。以前は、20013年の「Middle」のcharcodeがあり、バイナリは010011100 00101101です。詳細は次のとおりです。
var code = 20013; code.toString(2); // => 10011100101は01001110 00101101に相当します
次に、上記の「A」を埋める方法に従って、位置を埋めます。
補完01001110 00101101前から1110xxxxx 10xxxxxx 10xxxxxxまでの順序で。 11100100 10111000 10101101を取得します。
4。UTF8エンコードされたコンテンツを取得します
上記の手順を通じて、3つのUTF8バイト「in」、11100100 10111000 1010110101が取得されます。
各バイトをヘキサデシマルに変換し、0xe4 0xb8 0xadを取得します。
次に、この0xe4 0xb8 0xadは、ついに得たUTF8エンコードです。
NodeJSバッファーを使用して、それが正しいかどうかを確認します。
var buffer = new Buffer( 'in'); console.log(buffer.length); // => 3Console.log(バッファー); // => <バッファーE4 b8 ad> //最後に3バイトを取得する0xe4 0xb8 0xad
16進数はケースフリーであるため、0xe4 0xb8 0xadであると計算したのとまったく同じですか?
上記のエンコードロジックを関数に書き込みます。
//文字列をutf8-Encoded bytes var writeutf = function(str、isgetbytes){var back = []; var bytesize = 0; for(var i = 0; i <str.length; i ++){var code = str.charcodeat(i); if(0x00 <= code && code <= 0x7f){bytesize += 1; back.push(code); } else if(0x80 <= code && code <= 0x7ff){bytesize += 2; back.push((192 |(31&(code >> 6))))); back.push((128 |(63&code)))} else if((0x800 <= code && code <= 0xd7ff)||(0xe000 <= code && code <= 0xffff)){bytesize += 3; back.push((224 |(15&(code >> 12)))); back.push((128 |(63&(code >> 6)))); back.push((128 |(63&code)))}} for(i = 0; i <back.length; i ++){back [i]&= 0xff; } if(isgetBytes){return back} if(bytesize <= 0xff){return [0、bytesize] .concat(back); } else {return [bytesize >> 8、bytesize&0xff] .concat(back); }} writeutf( 'in-on'); // => [0、3、228、184、173] //最初の2桁は、後続のUTF8バイトの長さを表します。長さが3であるため、最初の2バイトは `0、3` //コンテンツは` 228、184、173`であり、ヘキサデシマルに変換されます。 // UTF8エンコードされたバイトを読み取り、Unicodeの文字列var readutf = function(arr){if(typeof arr === 'string'){return arr; } var utf = ''、_arr = this.init(arr); for(var i = 0; i <_arr.length; i ++){var one = _arr [i] .toString(2)、v = one.match(/^1+?(?= 0)/); if(v && one.length == 8){var byteslength = v [0] .length; var store = _arr [i] .tostring(2).slice(7 -byteslength); for(var st = 1; st <byteslength; st ++){store += _arr [st +i] .toString(2).slice(2)} utf += string.fromCharcode(parseint(store、2)); i += byteslength -1} else {utf += string.fromcharcode(_arr [i])}} return utf} readutf([0、3、228、184、173]); => 'in'UTF8バイトコードを取得するために中国語を解析する別の方法
中国語をUTF8バイトコードに変換する別の比較的簡単な方法は比較的簡単です。ブラウザもメソッドを提供し、誰もがこの方法を使用しています。それは何ですか?それはecodeuriです。もちろん、ecodeuricomponentも問題ありません。
そうです、それが方法です。では、この方法は、Unicodeエンコードされた中国人をどのようにしてUTF8 bytecodeに変換しますか?
var str = ''; var code = encodeuri(str); console.log(code); // =>%E4%B8%AD
脱出した文字列を手に入れたことがわかりましたか?この文字列のコンテンツは、以前に上記のバイトコードと同じです。
次に、%E4%B8%ADを番号配列に変換します。
var codelist = code.split( '%'); codelist = codelist.map(item => parseint(item、16)); console.log(codelist); // => [228、184、173]
とても簡単です、~~~はありますか
この単純な方法の原則は何ですか?
URIでのクエリストリングエンコーディングの問題は次のとおりです。規制によれば、URIのQuerystringはUTF8エンコーディングに従って送信する必要があり、JavaScriptはUnicodeであるため、ブラウザはメソッド、つまりEncodeuri/ecodeuricoponentメソッドを提供します。この方法について説明します
英語以外のキャラクター(これは考慮されます、なぜ英語以外のキャラクターはないのですか?)は最初にUTF8 bytecodeに変換され、次に率直に追加されてスプライスされるため、漢字「中」を脱出し、「%e4%b8%ad」を取得しました。
まあ、それはすべての原則であり、他に何もありません。
ただし、この方法には別の欠点があります。つまり、英語以外のキャラクターを逃れるだけなので、英語のキャラクターをUTF8エンコーディングにフォーマットする必要がある場合、この方法はニーズを満たすことができず、英語のキャラクターを逃れる必要もあります。
では、分析したいときはどうすればよいですか? decodeuri/decodeuricomponentを使用するだけです。
var codelist = [228、184、173]; var code = codeList.map(item => '%'+item.toString(16))。join( ''); decodeuri(code); // =>
さて、この記事ではUTF8エンコーディングを紹介します。
UTF-8エンコーディングの原則を理解するのに役立つことを願っています。
上記は、JavaScriptを介したUTF-8エンコードのすべての実装方法です。誰もがwulin.comをもっとサポートすることを願っています〜