Exigence
Encoder le chinois avec gb2312 en js. Par exemple, « I » doit être codé comme « �� ».
Analyse
Comme nous le savons tous, encodeURI et encodeURIComponent seront codés en utf-8, par exemple "I" est codé avec "I". D'après les expériences, il semble qu'il n'y ait aucun paramètre permettant de spécifier l'encodage quelque part. Trouvez simplement un autre moyen.
Une analyse approximative propose les solutions suivantes :
1. Utilisez js pour créer une iframe cachée et spécifiez-la comme encodage gb2312, placez le texte qui doit être converti dans une entrée du formulaire iframe et spécifiez le formulaire comme méthode get et soumettez-le,
puis récupérez son URL et analysez-le, vous devriez pouvoir obtenir son texte codé en gb2312.
2. Utilisez ajax pour l'envoyer au serveur pour encodage, puis renvoyez-le.
3. Créez une table d'encodage gb2312 en js.
Mise en œuvre
Personnellement, la première solution semble trop compliquée et doit être testée dans plusieurs navigateurs différents.
La deuxième option nécessite la coopération d'un serveur.
Voici l'implémentation de la troisième solution :
Au début, nous avions prévu d'utiliser un tableau pour stocker la table d'encodage. Plus tard, afin de réduire la taille du fichier js, nous sommes passés au stockage de chaînes.
Donc, le code js est le suivant :
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 = ''; for (var i=0;i<str.length; i++){ var c = str.charAt(i); // +是空格 if (c == '+'){ strOut += ' '; } // a,b,c,1,2等,非%开头的,直接返回本身 else if (c != '%'){ 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='{0}';
(La ponctuation chinoise n'est pas prise en compte ici. La raison principale est que la ponctuation chinoise et la ponctuation japonaise et coréenne sont mélangées ensemble en Unicode, et ils sont distribués à plusieurs endroits. J'ai la flemme de le faire. Si quelqu'un l'a, pouvez-vous m'en envoyer une copie ?)
Enfin, utilisez .NET pour générer le code en z :
StringBuilder sb = new StringBuilder(); string strFormat = @"...z = '"; // 前面的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) + "';"; System.IO.File.WriteAllText(@"F:\encodeGb2312.js", str, Encoding.ASCII);