需求
在js中将中文用gb2312编码。如,“我”编码后应该是“%CE%D2”。
分析
大家知道,encodeURI和encodeURIComponent会用utf-8编码,如“我”编码后是“%E6%88%91”。据实验,似乎没有参数指定编码的地方。只有另寻他法。
大致分析有如下几种解决方案:
1. 用js创建一个隐藏的iframe并指定其为gb2312编码,将需要转换的文本放到iframe的form的一个input中,将form指定为get方式并提交,
然后获取其url并解析,应该可以得到其gb2312编码后的文本。
2. 用ajax传到服务器上编码,然后传回来。
3. 在js中创建一个gb2312编码表。
实现
第一种方案个人感觉太折腾,需要在多个不同的浏览器下测试。
第二种方案需要有服务器配合。
下面是第三种方案的实现:
最开始打算使用数组存储编码表,后来为了减小js文件大小,改用string来存储。
于是,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 = '' ; 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} ' ;
(这里没考虑中文标点,主要是看unicode里中文标点和日韩的标点混在一起,分布在几个地方,就懒得弄了。谁弄了可以发我一份,谢了。)
最后用.NET生成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);
最终js下载:
转载需注明出处: