Java处理生僻字的问题
生活随笔
收集整理的這篇文章主要介紹了
Java处理生僻字的问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
前幾天遇到了生僻字的問題。很有意思。在不同的平臺上顯示的字符不一樣,有些是方塊有些是?有些干脆就是一個表情圖標。
檢查了編碼沒有問題,是UTF-8。
研究了一下最終發現了原因。
出錯的字符,落到了UNICODE的私人造字區里面,參考如下。
http://jicheng.tw/hanzi/unicode.html
不同的系統/字體,不能保證私人造字區的一致性。
自己寫了段測試代碼,發現目前Unicode Base區,擴展ABCD均沒有問題,唯獨私人造字區不行。
解決方法也比較簡單,顯示字符之前進行檢測就行了,如果發現客戶姓名里面有私人造字區的字,那么不顯示“姓名,您好”而是顯示“親愛的客戶,您好”。
代碼如下。注意,在Unicode擴展區,一個字符是由兩個\u 表示的。也就是說String類的標準方法charAt等等不適用了,要采用codePointAt, codePointCount來進行字符的相關操作。
public class RareCharacterUtility {public static boolean containsUserDefinedUnicode(String string) {if (string == null) {throw new NullPointerException("Stirng must be non-null");}int[] code = toCodePointArray(string);// U+E000..U+F8FFfor (int c : code) {if (c >= '\ue000' && c <= '\uf8ff') {return true;}}return false;}static int[] toCodePointArray(String str) {int len = str.length();int[] acp = new int[str.codePointCount(0, len)];for (int i = 0, j = 0; i < len; i = str.offsetByCodePoints(i, 1)) {acp[j++] = str.codePointAt(i);}return acp;}static String toHex(int[] chars) {String r = "[";for (int i=0; i<chars.length; i++) {if (r.length() > 1) {r += ",";}r += Integer.toHexString(chars[i]);}r += "]";return r;}public static void main(String[] argu) {String rr = ("\u5f20\ue0bf\uD86C\uDE70\uD840\uDC10\uD86D\uDF44\uD87E\uDCAC\u9fc6");System.out.println("Unicode = " + toHex(toCodePointArray(rr)));boolean r = (containsUserDefinedUnicode(rr));System.out.println("Test result = " + r + " should be true");} }總結
以上是生活随笔為你收集整理的Java处理生僻字的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Web 技术】818- 一文带你层层解
- 下一篇: 深入理解Java虚拟机-高效并发