關於JS的編碼轉換問題

傑華園發表於2016-08-11

在進行JS開發過程中,尤其是在開發報表時,報表已整合到Web頁面中,透過在頁面傳遞引數至報表中時,會發現有時某些引數值,傳遞到報表中是顯示為問號或亂碼等等一系列不能正常顯示的情況。

這是由於瀏覽器和報表伺服器的編碼不同,字元多次進行編碼轉換時出現錯誤導致字元的顯示出現亂碼,尤其是中日韓文和特殊字元更容易出現亂碼問題。

以開發報表軟體FineReport為例,在給報表伺服器傳送請求之前,對URL或者只對URL裡面的引數名字和引數值,進行cjkEncode的編碼,該方式相容了各種不同的字符集,如ISO8859-1、 UTF-8、 GBK、 ENU_JP,尤其對中日韓文的處理採取了統一的方案。

javascript中FineReport字元轉換原理

在給報表伺服器傳送請求之前,對URL或者只對URL裡面的引數名字和引數值,進行cjkEncode的編碼。原始碼如下:

點選(此處)摺疊或開啟

  1. function cjkEncode(text) {
  2.     if (text == null) {
  3.         return "";
  4.     }
  5.     var newText = "";
  6.     for (var i = 0; i < text.length; i++) {
  7.         var code = text.charCodeAt (i);
  8.         if (code >= 128 || code == 91 || code == 93) {//91 is "[", 93 is "]".
  9.             newText += "[" + code.toString(16) + "]";
  10.         } else {
  11.             newText += text.charAt(i);
  12.         }
  13.     }
  14.     return newText;
  15. }

經過編碼的URL或者Form表單,報表伺服器智慧的將這些字元正確的轉換過來。

cjkEncode方法在FineReport的JS庫中已經預先提供了,使用者只要載入了FR的JS庫,就可以使用FR.cjkEncode對中日韓文字元進行encode,如下示例:

1、  對URL進行cjkEncode

點選(此處)摺疊或開啟

  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=GBK">
  4. <script type="text/javascript"    src="ReportServer?op=emb&resource=finereport.js"></script>
  5. <Script Language="JavaScript">
  6. function frOpen() {
  7.     window.location=FR.cjkEncode("地區=華東");
  8. }
  9. </Script>
  10. </head>
  11. <body>
  12. <input type="button" value="字元轉換1" onclick="frOpen()">
  13. </body>
  14. </html>

如果只對引數值進行編輯轉換,在引數後面呼叫FR.cjkEncode()方法,如:

window.location=""+FR.cjkEncode("華東"); 

2、對Form表單進行cjkEncode

點選(此處)摺疊或開啟

  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=GBK"/>
  4. <script type="text/javascript" src="/WebReport/ReportServer?op=emb&resource=finereport.js"></script>
  5. <script>
  6. function autoSubmit() {
  7.     var Region1 = document.getElementById('Region'); //獲取到引數Region所在文字框
  8.     Region1.value = FR.cjkEncode(Region.value); //對值引數值進行編碼轉化
  9.     Region1.name = FR.cjkEncode("地區"); //對引數控制元件名編碼轉換,如果引數名字為英文,則不需要此操作
  10.     document.FRform.submit();
  11. }
  12. </script>
  13. <body>
  14. <form name=FRform method=post action="/WebReport/ReportServer?reportlet=doc/Primary/Parameter/Parameter.cpt">
  15. <input type="text" id="Region" name="地區" value="華東">
  16. <input type="button" name="show" value= "檢視" onclick="autoSubmit()"/>
  17. </body>
  18. </html>

3、特殊符號處理

如果在需要進行cjkEncode的URI的引數中包含特殊字元,比如%,#,$,=,&,/,?,+,@等字元時,需要在cjkEncode之後,再次呼叫javascript的encodeURIComponent對這些特殊字元進行編碼。如引數值是”%華%“這樣的字元,就需要寫成encodeURIComponent(FR.cjkEncode("%華%")),一定要先進行cjkEncode,然後再進行encodeURIComponent,完整程式碼如下:

點選(此處)摺疊或開啟

  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=GBK">
  4. <script type="text/javascript"    src="ReportServer?op=emb&resource=finereport.js"></script>
  5. <Script Language="JavaScript">
  6. function frOpen() {
  7. window.location=FR.cjkEncode("地區=") +encodeURIComponent(FR.cjkEncode("%華%"));
  8.     }
  9. </Script>
  10. </head>
  11. <body>
  12. <input type="button" value="字元轉換1" onclick="frOpen()">
  13. </body>
  14. </html>

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/21472864/viewspace-2123320/,如需轉載,請註明出處,否則將追究法律責任。

相關文章