Heim  >  Artikel  >  Web-Frontend  >  Implementierungsmethode zur Verwendung der gb2312-Kodierung und -Dekodierung unter js

Implementierungsmethode zur Verwendung der gb2312-Kodierung und -Dekodierung unter js

高洛峰
高洛峰Original
2017-02-04 09:46:422075Durchsuche

Anforderung
Kodieren Sie Chinesisch mit gb2312 in js. Beispielsweise sollte „I“ nach der Codierung „%CE%D2“ sein.

Analyse
Wie wir alle wissen, werden encodeURI und encodeURIComponent in utf-8 codiert, zum Beispiel wird „I“ als „%E6%88%91“ codiert. Experimenten zufolge scheint es irgendwo keinen Parameter zur Angabe der Kodierung zu geben. Finde einfach einen anderen Weg.
Eine grobe Analyse bietet die folgenden Lösungen:
1. Erstellen Sie mit js einen versteckten Iframe und geben Sie ihn als gb2312-Kodierung an, geben Sie den zu konvertierenden Text in eine Eingabe in der Form des Iframes ein und geben Sie ihn an Rufen Sie das Formular als Get-Methode auf und senden Sie es ab.
Rufen Sie dann die URL ab und analysieren Sie sie. Sie sollten in der Lage sein, den gb2312-codierten Text abzurufen.
2. Verwenden Sie Ajax, um es zur Codierung an den Server zu senden, und senden Sie es dann zurück.
3. Erstellen Sie eine gb2312-Codierungstabelle in js.

Implementierung
Mir persönlich erscheint die erste Lösung zu umständlich und muss in mehreren verschiedenen Browsern getestet werden.
Die zweite Option erfordert die Zusammenarbeit eines Servers.
Das Folgende ist die Implementierung der dritten Lösung:
Zuerst hatten wir geplant, ein Array zum Speichern der Codierungstabelle zu verwenden. Um die Größe der js-Datei zu reduzieren, sind wir später auf String-Speicher umgestiegen.
Der js-Code lautet also wie folgt:

Code

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;;

(Chinesische Zeichensetzung wird hier nicht berücksichtigt. Der Hauptgrund ist, dass chinesische und japanische und koreanische Zeichensetzung gemischt sind zusammen in Unicode, und sie sind an mehreren Stellen verteilt. Wenn jemand es hat, können Sie mir eine Kopie schicken?)
Verwenden Sie schließlich .NET, um den Code unter z zu generieren:

Code

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);

Weitere Artikel zur Implementierungsmethode der Verwendung der gb2312-Kodierung und -Dekodierung unter js finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn