文字列、unicode、UTF 8符号化間の相互変換

3205 ワード

転載は文章の出所を明記してください.https://tlanyan.me/string-uni...
ある文字列のUTF 8コードを知りたくて、図は便利でオンラインツールを使うつもりです.ピットお父さんは、「UTF 8漢字相互回転」と呼ばれるページのほとんどが文字列とunicodeコードポイント相互回転であり、UTF 8符号化相互回転機能は提供されていない.unicodeコードポイント(code point)とUTF 8コードの関係が分からず、UTF 8コードを大言壮語しているのは無言です.
文字、バイト、バイト順、unicode、UTF 8符号化は、文字符号化の重要な概念を理解し、詳細は本人の前のブログファイルと文字符号化を表示することができます.本文はunicodeとUTF 8の間の変換を討論して、まず2つの概念を簡単に紹介します:unicodeは文字とコードポイント(code point、1つの整数)を1つ1つ対応する符号化方案です;符号点通はuXXXXまたはU+XXXXの方式で表され、XXXXは符号点の16進数である.UTF 8はunicodeの具体的な符号化方式であり、文字記憶の方式を規定する.UTF 8の符号化バイト数は可変で、サイズ端の問題はなく、インターネット通信ではこのような符号化方式が採用されることが多い.
あの一面の「漢字UTF 8符号化相互回転」ページでの出来事を振り返る.「中国」を例にとると、2つの漢字コード点はそれぞれ20013と22269で、16進数は4 E 2 D 56 FDを表し、UTF 8はE 4 B 8 AD E 5 9 B BDを符号化する.検索結果のhttp://www.ip138.com/utf8/、「中国」と入力し、「UTF-8の変換」ボタンをクリックすると、下に符号点の16進符号4 E 2 D 56 FD(16進のプレフィックス0 xと理解できる)が表示され、UTF 8符号化ではありません.
JavaScriptのStringオブジェクトには、charCodeAtcodePointAt(互換性はcharCodeAtに及ばない)の方法があります.この関数に基づいて、Webページの変換作業は次のコードで実現できます.
function encode(str) {
    var result = '';
    var len = str.length;
    for (var i = 0; i < len; ++ i) {
        result += '' + (str.charCodeAt(i)).toString(16) + ';';    //  16 , 
    }
    return result;
}

function decode(str) {
  return String.fromCharCode.apply(null, str.split(';').map(function(un) {
    return parseInt(un.replace('', ''), 16);      //  , 
  }).filter(function (num) {
    return !isNaN(num);
  }));
}
encode(“ ”)または他の文字列が呼び出され、各文字に対応する符号点の16進数が得られる.しかし、これは文字列のUTF 8符号化ではありません!
UTF 8符号化を取得するには、符号点に基づいてさらに一歩進む必要があります.まずunicodeコードポイントとUTF 8の変換関係をレビューします.
unicodeコードポイント(16進法)
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
この表によれば、charCodeAt関数と組み合わせて、UTF 8符号化関数に文字列を書くことができる.
//  utf8 
function getUTF8Bytes(str) {
  var bytes = [];
  var len = str.length;
  for (var i = 0; i < len; ++ i) {
    var code = str.charCodeAt(i);
    if (code >= 0x10000 && code < = 0x10ffff) {
      bytes.push((code >> 18) | 0xf0);                //  
      bytes.push(((code >> 12) & 0x3f) | 0x80);
      bytes.push(((code >> 6) & 0x3f) | 0x80);
      bytes.push((code & 0x3f) | 0x80);
    } else if (code >= 0x800 && code < = 0xffff) {
      bytes.push((code >> 12) | 0xe0);
      bytes.push(((code >> 6) & 0x3f) | 0x80);
      bytes.push((code & 0x3f) | 0x80);
    } else if (code >= 0x80 && code < = 0x7ff) {
       bytes.push((code >> 6) | 0xc0);
       bytes.push((code & 0x3f) | 0x80);
    } else {
      bytes.push(code)
    }
  }

  return bytes;
}

//  16 
function hexString(bytes) {
  var arr = bytes.map(function (code) {
    return (code).toString(16).toUpperCase();
  });

  return arr.join(' ');
}

function utf8(str) {
   return hexString(getUTF8Bytes(str));
}

関数utf8を呼び出します.これこそJavaScriptが文字列のUTF 8符号化を得る正しい姿勢です.UTF 8符号化から文字列に変換し、逆の作業をすればよい.