latin1轉gbk的亂碼問題,jdbc的bug

2021-09-01 18:23:54 字數 1136 閱讀 9209

有時候json檔案,純文字的檔案在nginx或者tomcat上為亂碼

可能不像html或者jsp那樣可以設定字元編碼

注意nginx和tomcat都有utf8的配置

另外要注意

檔案也有編碼

linux下用vim開啟

:set encoding=utf-8

:set fileencoding=utf-8轉參考

由於以前偷懶的原因,很多資料庫都是使用latin1作為字元編碼,這樣可以原樣保留資料的位元組流,但是最近發現新版的mysql驅動,包括345各版本的最新驅動,用characterencoding=latin1 引數去訪問資料,都會出現問號亂碼的問題。

在網上查了一下,有人說是驅動裡面自帶強制轉換,所以出了問題,根據提示看了一下**,果然在

resultsetrow在getstring的時候,會使用 singlebytecharsetconverter 來強制轉碼,發生了問題。

網上說要修改驅動,我自己嘗試了一下,既然強制轉碼裡面選擇了使用cp1252,那這個字符集應該也是單字元全集,所以我直接嘗試用該字符集來連線,問題就解決了。。。。

有兩種解決方案:

1. 使用resultset中的getbytes方法,直接獲取原始bytes陣列,自己按照錄入時候的編碼new string即可。

2. 如果用了框架結構,寫了必須獲取string的,那麼連線引數可以寫

characterencoding=cp1252

程式使用的時候

rs.getstring(1).getbytes(「cp1252″)

即可獲取原始位元組陣列,然後也是按照錄入編碼進行 new string 即可。

注意這種方法可能會引起問題,由於cp1252對一些位元組的處理並不是我們理解的那樣,比如

mysql translates 0×81 to unicode 0×0081, 0x8d to 0x008d, 0x8f to 0x008f, 0×90 to 0×0090, and 0x9d to 0x009d.

如果漢字裡面剛好有著3中位元組的,就會出問題,顯示問號。。。

研究了一下,發了乙個bug帖,

估計也是沒人理會的了,呵呵,就當練練英文。

我的程式:

MySQL基礎知識 Latin1

latin1是 iso 8859 1的別名,有些環境下寫作latin 1。iso 8859 1 iso 8859 1編碼是單 位元組編碼,向下相容 ascii,其編碼範圍是0x00 0xff,0x00 0x7f之間完全和ascii一致,0x80 0x9f之間是 控制字元,0xa0 0xff之間是文字...

mysql 的 latin1 中文支援

初學者往往會犯糊塗,mysql 的預設字符集 latin1 是否支援中文?初步分析表明,是的,確實支援中文!是初步的結論,只做了初步的分析 1.先來看看 latin1 latin1 是iso 8859 1的別名,有些環境下寫作latin 1。iso 8859 1 編碼是單位元組編碼 向下相容asci...

mysql 的 latin1 支援中文

初學者往往會犯糊塗,mysql 的預設字符集 latin1 是否支援中文?初步分析表明,是的,確實支援中文!是初步的結論,只做了初步的分析 latin1是iso 8859 1的別名,有些環境下寫作latin 1。iso 8859 1編碼是單位元組編碼,向下相容ascii,其編碼範圍是0x00 0xf...