幾種字符亂碼


其他編碼轉成iso8859-1出現亂碼?(問號):

    原因:是因爲iso8859-*的處理邏輯,對不存在的的碼值直接解析爲?號(0x3F)

   演示:

// 控制檯設置爲iso8859-1,輸出一個左手圖標"☜",控制檯顯示亂碼
System.out.println('\u261c');

    解決:

    處理好不同編碼,iso是西歐用的比較多的編碼,如果只是一個地區可以用gbk,建議把最基本編碼方式設置爲utf-*或者unicode形式,這樣兼容性更好些


unicode編碼字符輸出顯示方括號,或者方框中帶一個16進制的值:

    原因:缺少字體,我們平時在輸入一個編碼時其實是輸入內碼,或者稱之爲區位碼,顯示的字符是通過區位碼找到對應的具體字符點陣信息,該信息纔是顯示的圖形符號的具體信息,現在操作系統用字符庫記錄字符點陣信息(如:24X24,32X32)。unicode由於定義了大量的字符區位碼,但是沒有提供對應的字符點陣,所以各個系統上不一定有對應的點陣信息,當然官方提供了一個字符庫,但是裏面不能顯示所有的字符,有些解析成顯示方框加16進制值,大部分系統中會顯示成一個方框

   演示代碼:  

// 控制檯設置爲utf-8,顯示"&#211B8;",由於我的系統中不存在這個字符,因此無法正確顯示該字符
System.out.println(Character.toChars(0x211B8));

    解決:

    添加字體,把生僻字庫加入即可



GBK編碼轉成utf-8編碼出現“��”種方式的亂碼

    原因:GBK和UTF-8互轉是不對稱的,即統一個GBK轉成的UTF-8後的值轉回來不一定是相同的GBK(會添加0x00)

    演示:

// 控制檯設置爲UTF-8, 用GBK的byte序列去安unicode方式解析
System.out.println(new String("中國".getBytes("GBK")));

    解決:

    gbk和utf-8轉碼需要根據utf-8編碼方式進行代碼編寫,可以網上找下,也可以自己根據規則寫,但是不能直接轉。同樣gbk奇數位的轉碼也是有問題的,自己思考下編碼方式就可知道



常規編碼顯示出錯:

    原因:主要是由於不同編碼轉換沒出處理好導致,編碼只要做到對稱轉換基本能解決這個問題

    解決:選擇正確的編碼,如果不知道原先是何種編碼,可以採用jchardet(jchardet是mozilla自動字符集探測算法代碼的java移植)的編碼試探方式找出具體編碼。

  


顯示unicode中編碼值大於16位的字符:

System.out.println(Character.toChars(0x211B8));

// 不能通過System.out.println("\u0x211B8");
// 也不能通過賦值給char數組輸出






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章