Requirements Encode Chinese with gb2312 in js. For example, "I" should be encoded as "��".
Analysis As we all know, encodeURI and encodeURIComponent will be encoded in utf-8, such as "I" is encoded with "I". According to experiments, it seems that there is no parameter to specify the encoding somewhere. Just find another way.
A rough analysis has the following solutions: 1. Use js to create a hidden iframe and specify it as gb2312 encoding, and put the text that needs to be converted into an input of the iframe's form , specify the form as the get method and submit it,
then get its url and parse it, you should be able to get its gb2312 encoded text.
2. Use ajax to send it to the server for encoding, and then send it back.
3. Create a gb2312 encoding table in js.
Implementation The first solution feels too fiddly and needs to be tested in multiple different browsers.
The second option requires server cooperation.
The following is the implementation of the third solution:
At first, I planned to use an array to store the encoding table. Later, in order to reduce the size of the js file, I switched to string storage.
So, the js code is as follows:
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;ivar c = str.charAt(i);
// is a space
if (c == ' '){
strOut = ' ';
}
// a, b, c, 1, 2, etc., if they do not start with %, return themselves directly
else if ( c != '%'){
strOut = c;
}
// % starts with
else{
i;
var nextC = str.charAt(i);
// Numbers, not Chinese characters
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}';
(Chinese punctuation is not considered here, mainly based on Chinese punctuation and Japanese and Korean punctuation in unicode The punctuation marks are mixed together and distributed in several places, so I am too lazy to do them. Whoever has it can send me a copy, thanks. )
Finally use .NET to generate the code at z:
Code
StringBuilder sb = new StringBuilder();
string strFormat = @"...z = '"; // Previous js code
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);