關於JS的編碼轉換問題
在進行JS開發過程中,尤其是在開發報表時,報表已整合到Web頁面中,透過在頁面傳遞引數至報表中時,會發現有時某些引數值,傳遞到報表中是顯示為問號或亂碼等等一系列不能正常顯示的情況。
這是由於瀏覽器和報表伺服器的編碼不同,字元多次進行編碼轉換時出現錯誤導致字元的顯示出現亂碼,尤其是中日韓文和特殊字元更容易出現亂碼問題。
以開發報表軟體FineReport為例,在給報表伺服器傳送請求之前,對URL或者只對URL裡面的引數名字和引數值,進行cjkEncode的編碼,該方式相容了各種不同的字符集,如ISO8859-1、 UTF-8、 GBK、 ENU_JP,尤其對中日韓文的處理採取了統一的方案。
javascript中FineReport字元轉換原理
在給報表伺服器傳送請求之前,對URL或者只對URL裡面的引數名字和引數值,進行cjkEncode的編碼。原始碼如下:
點選(此處)摺疊或開啟
-
function cjkEncode(text) {
-
if (text == null) {
-
return "";
-
}
-
var newText = "";
-
for (var i = 0; i < text.length; i++) {
-
var code = text.charCodeAt (i);
-
if (code >= 128 || code == 91 || code == 93) {//91 is "[", 93 is "]".
-
newText += "[" + code.toString(16) + "]";
-
} else {
-
newText += text.charAt(i);
-
}
-
}
-
return newText;
- }
經過編碼的URL或者Form表單,報表伺服器智慧的將這些字元正確的轉換過來。
cjkEncode方法在FineReport的JS庫中已經預先提供了,使用者只要載入了FR的JS庫,就可以使用FR.cjkEncode對中日韓文字元進行encode,如下示例:
1、 對URL進行cjkEncode
點選(此處)摺疊或開啟
-
<html>
-
<head>
-
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
-
<script type="text/javascript" src="ReportServer?op=emb&resource=finereport.js"></script>
-
<Script Language="JavaScript">
-
function frOpen() {
-
window.location=FR.cjkEncode("地區=華東");
-
}
-
</Script>
-
</head>
-
<body>
-
<input type="button" value="字元轉換1" onclick="frOpen()">
-
</body>
- </html>
如果只對引數值進行編輯轉換,在引數後面呼叫FR.cjkEncode()方法,如:
window.location=""+FR.cjkEncode("華東");
2、對Form表單進行cjkEncode
點選(此處)摺疊或開啟
-
<html>
-
<head>
-
<meta http-equiv="Content-Type" content="text/html; charset=GBK"/>
-
<script type="text/javascript" src="/WebReport/ReportServer?op=emb&resource=finereport.js"></script>
-
<script>
-
function autoSubmit() {
-
var Region1 = document.getElementById('Region'); //獲取到引數Region所在文字框
-
Region1.value = FR.cjkEncode(Region.value); //對值引數值進行編碼轉化
-
Region1.name = FR.cjkEncode("地區"); //對引數控制元件名編碼轉換,如果引數名字為英文,則不需要此操作
-
document.FRform.submit();
-
}
-
</script>
-
<body>
-
<form name=FRform method=post action="/WebReport/ReportServer?reportlet=doc/Primary/Parameter/Parameter.cpt">
-
<input type="text" id="Region" name="地區" value="華東">
-
<input type="button" name="show" value= "檢視" onclick="autoSubmit()"/>
-
</body>
- </html>
3、特殊符號處理
如果在需要進行cjkEncode的URI的引數中包含特殊字元,比如%,#,$,=,&,/,?,+,@等字元時,需要在cjkEncode之後,再次呼叫javascript的encodeURIComponent對這些特殊字元進行編碼。如引數值是”%華%“這樣的字元,就需要寫成encodeURIComponent(FR.cjkEncode("%華%")),一定要先進行cjkEncode,然後再進行encodeURIComponent,完整程式碼如下:
點選(此處)摺疊或開啟
-
<html>
-
<head>
-
<meta http-equiv="Content-Type" content="text/html; charset=GBK">
-
<script type="text/javascript" src="ReportServer?op=emb&resource=finereport.js"></script>
-
<Script Language="JavaScript">
-
function frOpen() {
-
window.location=FR.cjkEncode("地區=") +encodeURIComponent(FR.cjkEncode("%華%"));
-
}
-
</Script>
-
</head>
-
<body>
-
<input type="button" value="字元轉換1" onclick="frOpen()">
-
</body>
- </html>
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/21472864/viewspace-2123320/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 關於Jmeter引數化的編碼問題JMeter
- PHP 與 JS 的編碼問題PHPJS
- 關於tomcat在idea上的中文編碼問題TomcatIdea
- 關於mysql字元和數字型別轉換的問題研究MySql字元型別
- 關於檔案上傳下載的編碼問題
- 編碼轉換
- 關於 iconv 轉碼導致資料丟失的問題
- 關於Java中進位制轉換以及位運算問題Java
- URL編碼轉換
- 字元編碼轉換字元
- 關於 a 標籤跳轉問題
- JS、C#中URL編碼解碼問題JSC#
- 關於js執行緒問題的解讀JS執行緒
- scheme跳轉特殊字元編碼問題Scheme字元
- 關於JDK21控制檯字符集編碼問題JDK
- 關於浮動會錯亂的問題——轉換思維尋找替代方案
- DevSecOps五個需要關注的編碼問題dev
- JS:關於JS字面量及其容易忽略的12個小問題JS
- [Python3] 關於Bytes與String 寫檔案遇到的編碼問題Python
- 關於kindeditor插入程式碼問題
- 關於Filter中ServletRequest強轉HttpServletRequest問題FilterServletHTTP
- 一個關於ace-editor編輯器的問題
- 關於Redis的問題探討(二):Range方法返回的物件是LinkeHashMap以及轉換辦法Redis物件HashMap
- 關於公司程式碼許可權的問題
- 關於this指向的問題
- 檢測檔案編碼,轉換檔案編碼
- 關於linux切換使用者只顯示$的問題Linux
- (求教)關於js函式按值、引用傳遞的問題JS函式
- Java 正確的做字串編碼轉換Java字串編碼
- 關於Xcode 10.0編譯不通過的問題 stdc++.6.0.9XCode編譯C++
- 一個關於JS解決陣列相乘問題JS陣列
- 陣列和列表的轉換問題陣列
- 遇到的編碼問題、時區問題整理
- 關於本地GB2312編碼的檔案上傳github後 中文出現亂碼的問題Github
- 轉換Linux 檔案編碼方式Linux
- (一) 溫度轉換問題
- mysql隱式轉換問題MySql
- 關於程式碼如何執行的五個問題
- 關於原始碼防洩密的本質問題原始碼