Java 開發中遇到的亂碼問題

2021-04-13 00:52:58 字數 2013 閱讀 5026

unicode的空間分配:

以下unicode區位碼均以16進製表示

unicode的前256個字元和iso-8859-1(西歐字母)完全相同,其中前半段就是ascii(u+0000到u+00ff)。每個iso-8859-1碼前面補上乙個空byte(0x00)後才是相應的unicode碼。

和我們切身相關的unihan主要分布在u+3400到u+f9fff之間,gb2312和big5主要分布在u+4e00到u+9fff之間。

utf-8的編碼原理和特性:

知道了西歐字元和漢字在unicode中的位置後,來看看utf-8

u+0000~u+007e 1 _ _ _ _ _ _ _ (7bits)

u+0080~u+07ff 1 1 0_ _ _ _ _ 1 0_ _ _ _ _ _ (11bits)

u+0800~u+ffff 1 1 1 0 _ _ _ _ 1 0 _ _ _ _ _ _ 1 0 _ _ _ _ _ _ (16bits)

看一看unicode三種格式提出自由的bits(下劃線空位)是否足以用來代表區位中各unicode碼,剛好夠用。

那麼當程式處理utf-8編碼檔案時,如何得知乙個字元的疆界落在**?還有到底他是以三種形式那一中出現呢?

每個以utf-8編碼的字元,不管是以

一、二、三個bytes出現,第乙個byte前端都清楚地標示了該字元的byte總數。如110種有兩個1,代表這種字元是以第二種方式出現,由兩個bytes組成。而1110有三個1,表示這種字元一點種方式出現,由三個位元組組成。

每個多重byte的utf-8編碼有乙個共同的通性,即其中的第二個第三個byte, 一律以10兩個bits開頭。由於其中的最高位總設成1,可以很容易和那些在utf-8中只用乙個byte的ascii字元區分開來,方便除錯。

因為上述設計特點,utf-8和unicode之間,可以很容易做雙向自由轉換,而不會丟失任何資料。

解決辦法:亂碼問題在 nt作業系統我沒怎麼碰到過,但是在unix 或linux系統上出現的比較多

由於作業系統和使用環境不一樣,產生亂碼的方式也不一樣,但是如果掌握了上面的unicode 編碼原理,自己仔細分析一下,很多問題便可迎刃而解。

下面看看幾個常見的例子。

1. 如果一些**伺服器例如tomcat 如果遇到中文亂碼問題,可以修改conf目錄下的server.xml

enablelookups="false" redirectport="8443" acceptcount="100" debug="0"connectiontimeout="20000" disableuploadtimeout="true" uriencoding="gbk"/>

uriencoding 設成gbk或gb2312

2. 表單中或傳遞字串:本來輸入的漢字是正常的,但是提交後再顯示出來是亂碼,因為提交的一般是 iso8859編碼,所以顯示的時候要轉成gb2312編碼:

string s=new string(rs.getstring("news").getbytes("gb2312"),"iso8859_1");

//rs為待轉換的字串

然後使用s字串的值就可以了

3. 有的伺服器端的語言環境如果設成簡體中文的也可以解決此類問題

4. 插入資料庫中的字元是亂碼

看看資料庫中支援的是何種編碼方式,用類似2中的方式作一下轉換即可。

5. 總之,用jsp開發,碰到亂碼,你得分析是讀的時候發生亂碼,還是寫的時候發生亂碼,用2中的轉換,基本就能解決問題,有些時候寫的時候做一次轉換,例如:

string s=new string(rs.getstring("news").getbytes("gb2312"),"iso8859_1");

//讀的時候在轉換回來

string s=new string(rs.getstring("news").getbytes("iso8859_1"),"gb2312");

或者把iso8859-1和gb2312 的位置換一下,自己多試試,就能找到解決問題的辦法。

《坦克大戰Java 開發中遇到的問題

01 程式設計方法問題 螺旋增加式 從0到1,不要急 腳踏實地 不求快,只求能編出想要的結果,多列印,多顯示 02 子彈發射數量問題 如果只是在fire方法中new乙個missle,則玩來玩去只是一枚飛彈 我們這時需要用容器。在yard類屬性中新增乙個arraylist飛彈鍊錶,然後在paint重寫...

開發中遇到的問題

最後再一次單步除錯中發現 nsurl urlwithstring 返回的nsurl居然為nil。大概找到問題所在了,在網上查了如何解決獲取空的nsurl,大致方法如下 原因 nsurl urlwithstring 這個方法要求傳乙個字串型別的引數,引數如果有中文的話,得到的物件就是空。解決辦法 先把...

開發中遇到的問題

1 element框架 實現 固定寬度 動態寬度 固定寬度 三個中 誰最長總體高度就是誰 固定寬度 實現效果是2 element框架 實現 響應式布局 使用js動態生成width 並渲染 3 hash模式下共用乙個 頻繁切換tab導致出現 非同步問題 使用同乙個axios 引數不一樣 返回的結果不同...