>  기사  >  웹 프론트엔드  >  js에서 gb2312 인코딩 및 디코딩을 사용하는 구현 방법

js에서 gb2312 인코딩 및 디코딩을 사용하는 구현 방법

高洛峰
高洛峰원래의
2017-02-04 09:46:422075검색

요구사항
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 인코딩 테이블을 만듭니다.

구현
개인적으로 첫 번째 솔루션은 너무 까다로워서 여러 다른 브라우저에서 테스트해야 합니다.
두 번째 옵션은 서버의 협조가 필요합니다.
다음은 세 번째 솔루션의 구현입니다.
처음에는 배열을 사용하여 인코딩 테이블을 저장할 계획이었지만 나중에 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;;

(여기서 중국어 구두점은 고려하지 않습니다. 주로 중국어 구두점과 일본어 및 한국어 구두점이 유니코드로 혼합되어 있기 때문입니다. 여러 곳에 배포되어 있는데 너무 게으른 나머지 혹시 갖고 계시다면 사본을 보내주실 수 있나요? 감사합니다.
마지막으로 .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 인코딩 및 디코딩 구현 방법에 대한 관련 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.