特殊的空格(Java無法替換字符串中的空格)


一、自己的問題

先說一下自己碰到的問題,自己在本地建立了一個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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM