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