當AJAX遭遇GBK的尷尬

2021-08-22 06:32:25 字數 1185 閱讀 6077

我在之前的一篇文章《struts,ajax亂碼解決方案》中講到ajax提交亂碼的解決方案。這個方案在utf-8的編碼下,不管提交或獲取都沒有變成亂碼,但當你的客戶端是gbk編碼時提交就會出現亂碼(獲取時不會)。beansoft

說用encodeuricomponent保險,呵呵,這個不是我沒試過,從一開始我就試過了encodeuricomponent ,escape,encodeuri,但最後出來的結果都沒我說的那種好。它們使用的結果如下:

escape  後提交,getparameter出來的是null,

encodeuri 後提交,和沒使用用的時候是乙個樣,

encodeuricomponent  後提交,包含特殊字元的請求都無法取得正確的值。

使用gbk編碼提交後的資料在使用伺服器端用new string( value.getbytes("gbk"), "utf-8")後部分可以恢復正確的中文,但有一部分無法恢復,這個原因估計是ajax提交時設定了編碼為utf-8,但我字元的實際編碼是gbk,所以在提交用用request.getparameter()獲得的資料是用utf-8的編碼在gbk的字符集中找字元,像我在《struts,ajax亂碼解決方案》

中說的那樣,utf-8的編碼可能有1位2位或3位16進製制,如果它這個編碼剛好是2位的話,那在gbk可以找到正確的字元(但並不是正確的),但如果是三位呢?那就慘了,它後面的字元全部就會變成亂碼,比如%6d%51%c5 %e5%23%1c分別表示乙個utf-8編碼的中文字元,那如果在gbk中,就會把它當成三個字元去查詢,當然肯定是找不到的,有些找到的也是你讀都讀不出來的。用new string( value.getbytes("gbk"), "utf-8")後就是用gbk的編碼在utf-8的字符集中查詢字元,如果剛好你的字元在utf-8編碼中全部是2位的話,那就能正確恢復,如果不是的話。。。。。。

現在還沒找到在gbk編碼下比較好的解決方案,但今天看到beansoft

的一篇文章《jsp 中 ajax 的表單提交中文問題的簡單解決方案

》說到使用base64的方法,這個倒是沒有試過,過兩天放假的時候就試一下,如果成功了就跟大家共享一下。

ps:因為專案用也用到了filter,在提交後第一時間會被改變字元編碼,不知道是不是這個增加的亂碼解決的複雜性,當然我也試過在getparameter之前改變它的編碼回utf-8,但結果是一樣的。

errorfun 2006-12-30 13:34

gbk編碼下ajax提交亂碼的解決

本來想整個專案都用gbk編碼應該不會出現亂碼的,但是不明白jquery為啥不能修改編碼,只能用utf 8.提交過去就是亂碼,正當編碼流程我想是這樣的 ajax utf 8 編碼過濾器 gbk action中顯示為亂碼 起初的解決辦法 在action中先用gbk進行編碼然後在用utf 8解碼 感覺沒有...

gbk編碼下ajax提交亂碼的解決

本來想整個專案都用gbk編碼應該不會出現亂碼的,但是不明白jquery為啥不能修改編碼,只能用utf 8.提交過去就是亂碼,正當編碼流程我想是這樣的 ajax utf 8 編碼過濾器 gbk action中顯示為亂碼 起初的解決辦法 在action中先用gbk進行編碼然後在用utf 8解碼 感覺沒有...

當AdGuard遭遇360安全衛士的應對之策

眾所周知,adguard軟體對各種型別的廣告具備有效攔截,除此之外,也可以通過管理第三方cookie 快取 資料引數等方式充分保障使用者的隱私安全。由於該廣告攔截軟體功能特性的要求,在電腦系統中會預設占用某些許可權。而360安全衛士屬於系統安全軟體,兩款軟體產品在系統許可權方面會產生一些衝突。那麼當...