ホームページ  >  記事  >  ウェブフロントエンド  >  js上でgb2312エンコード・デコードを利用する実装方法

js上でgb2312エンコード・デコードを利用する実装方法

高洛峰
高洛峰オリジナル
2017-02-04 09:46:422132ブラウズ

要件
中国語をjsのgb2312でエンコードします。たとえば、「I」はエンコード後は「%CE%D2」になるはずです。

分析
ご存知のとおり、encodeURI と encodeURIComponent は utf-8 でエンコードされます。たとえば、「I」は「%E6%88%91」としてエンコードされます。実験したところ、どこかにエンコーディングを指定するパラメータがないようです。別の方法を見つけてください。
大まかな分析には次の解決策があります: 1. js を使用して非表示の iframe を作成し、それを gb2312 エンコーディングとして指定し、変換する必要があるテキストを iframe のフォームの入力に置き、そのフォームを get として指定します。メソッドを作成して送信し、
次にその URL を取得して解析すると、gb2312 でエンコードされたテキストを取得できるはずです。
2. ajax を使用してサーバーに送信し、エンコードしてから送り返します。
3. jsでgb2312エンコーディングテーブルを作成します。

実装
最初の解決策は個人的にはあまりにも面倒に感じられるため、複数の異なるブラウザでテストする必要があります。
2 番目のオプションでは、サーバーの連携が必要です。
以下は 3 番目の解決策の実装です:
最初は、エンコード テーブルを格納するために配列を使用する予定でしたが、その後、js ファイルのサイズを削減するために、文字列ストレージに切り替えました。
したがって、js コードは次のとおりです:

コード

function encodeToGb2312(str){ 
var strOut=""; 
for(var i = 0; i < str.length; i++){ 
var c = str.charAt(i); 
var code = str.charCodeAt(i); 
if(c==" ") strOut +="+"; 
else if(code >= 19968 && code <= 40869){ 
index = code - 19968; 
strOut += "%" + z.substr(index*4,2) + "%" + z.substr(index*4+2,2); 
} 
else{ 
strOut += "%" + str.charCodeAt(i).toString(16); 
} 
} 
return strOut; 
} 
function decodeFromGb2312(str){ 
var strOut = &#39;&#39;; 
for (var i=0;i<str.length; i++){ 
var c = str.charAt(i); 
// +是空格 
if (c == &#39;+&#39;){ 
strOut += &#39; &#39;; 
} 
// a,b,c,1,2等,非%开头的,直接返回本身 
else if (c != &#39;%&#39;){ 
strOut += c; 
} 
// %开头 
else{ 
i++; 
var nextC = str.charAt(i); 
// 数字,则不是汉字 
if (!isNaN(parseInt(nextC))){ 
i++; 
strOut += decodeURIComponent(c+nextC+str.charAt(i)); 
} 
else{ 
var x = new String(); 
try 
{ 
var code = str.substr(i,2)+str.substr(i+3,2); 
i = i + 4; 
var index = -1; 
while ((index = z.indexOf(code,index+1)) != -1){ 
if (index%4 == 0){ 
strOut += String.fromCharCode(index/4+19968); 
break; 
} 
} 
}catch(e){} 
} 
} 
} 
return strOut; 
} 
var z=&#39;{0}&#39;;

(ここでは中国語の句読点は考慮されていません。主な理由は、Unicode では中国語の句読点と日本語および韓国語の句読点が混在しており、それらはいくつかの場所に分散されているためです。

最後に .NET を使用して z でコードを生成します。

コード

StringBuilder sb = new StringBuilder(); 
string strFormat = @"...z = &#39;"; // 前面的js代码 
const int MinHanzi = 19968; 
const int MaxHanzi = 40869; 
for (int i = MinHanzi; i < MaxHanzi + 1; i++) 
{ 
byte[] bytes = Encoding.GetEncoding("gb2312").GetBytes(((char)i).ToString()); 
sb.AppendFormat("{0}{1}", Convert.ToString(bytes[0], 16).ToUpper(), Convert.ToString(bytes[1], 16).ToUpper()); 
} 
string str = strFormat + sb.ToString(0, sb.Length - 1) + "&#39;;"; 
System.IO.File.WriteAllText(@"F:\encodeGb2312.js", str, Encoding.ASCII);

gb2312 のエンコードとデコードの実装メソッドに関する詳細については、以下の記事を参照してください。 js の場合は、PHP 中国語 Web サイトに注意してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。