一、自己的問題
先說一下自己碰到的問題,自己在本地建立了一個json文件,並且把它格式化了(為了看着美觀);然后在Java后台中去讀取(使用BufferedReader的readline方法),但是讀取后的Json字符串總是帶着一部分空白,使用了多種替換方式(trim,空格,換行符,制表符等)都無法消除空格,導致后續創建json對象時提示錯誤。
原因:是因為這個讀取到的不是Java常見的空格字符,而是特殊的空格(ASCII值160,嚴格來說這個是擴展ASCII值的部分,因為原生ASCII最大只到127),因此不能使用常規的替換方式。
具體處理見下文(轉載的博客,為了加深記憶,特意又放到自己的博客中)。
二、處理辦法
最近遇到個問題,在頁面的搜索框輸入帶有空格的字符串時,總是無法從db中搜索出來對應的數據,於是將db里的空格復制出來,發現其ASCII碼值為160,這才知道,原來ASCII碼中除了32之外還有160這個特殊的空格。下邊是查看字符對應ASCII值的邏輯:
final char c1 = ' '; //db里的空格 final char c2 = ' '; //手動輸入的空格 System.out.println((int)c1); //160 System.out.println((int)c2); //32
平時我們用鍵盤輸入的空格的ASCII值是32,而這個ASCII值為160的空格,其實是不間斷空格(non-breaking space),是不是從來沒聽說過這東東?其實你平時一定也用過很多次的,就是頁面上的 所產生的空格。
不間斷空格non-breaking space的縮寫正是nbsp。這中空格的作用就是在頁面換行時不被打斷,如下:
頁面某一行的末尾是一個人名Zhang Xiaoming
我們希望在換行時人名不會被打斷,導致Zhang 在第一行末尾,而Xiaoming跑到第二行開頭,而是保持完整的人名在同一行的末尾,於是就有了不間斷空格。(在word中也有這種空格的使用)
如果使用了平常的空格,就會被頁面壓縮,變成下邊這樣
頁面某一行的末尾是一個人名Zhang
Xiaoming
問題
但是不間斷空格有個問題,就是它無法被trim()所裁剪,也無法被正則表達式的\s所匹配,也無法被StringUtils的isBlank()所識別,也就是說,無法像裁剪尋常空格那樣移除這個不間斷空格。
我們可以利用不間斷空格的Unicode編碼來移除它,其編碼為\u00A0。
解決辦法如下:
replace("\u00A0", "") replaceAll("\\u00A0+", "") //這是正則表達式的寫法 String str = "aacsdfe "; //包含了不間斷空格的字符串 str = str.replace("\u00A0", ""); str = str.replaceAll("\\u00A0+", "");
————————————————
本文不是個人原創。
附原文鏈接:https://blog.csdn.net/lewky_liu/article/details/79353151