![](/img/trans.png)
[英]Apache POI Anomalous Whitespace (Resolved: \u00A0 non-breaking space)
[英]Why is non-breaking space not a whitespace character in java?
在尋找一種從解析的HTML中修剪不間斷空間的正確方法的同時,我首先偶然發現了java的String.trim()
的spartan定義,該定義至少是正確記錄的。 我想避免明確列出符合修剪條件的字符,所以我假設在Character類上使用Unicode支持的方法可以幫我完成工作。
那時我發現Character.isWhitespace(char)明確排除了不間斷的空格:
它是一個Unicode空格字符(
SPACE_SEPARATOR
,LINE_SEPARATOR
或PARAGRAPH_SEPARATOR
), 但也不是一個不間斷的空格 ('\ '
,'\ '
,'\ '
)。
這是為什么?
相應的.NET等價物的實現不那么有區別。
Character.isWhitespace(char)
很舊。 真的老了。 Java早期的許多事情都遵循C的約定和實現。
現在,十多年后,這些事情似乎是錯誤的。 考慮一下即使在Java的第一天和.NET的第一天之間已經發生了多大的事情。
Java力求100%向后兼容。 因此,即使Java團隊認為修復他們的初始錯誤並在從Character.isWhitespace(char)返回true的字符集中添加不間斷空格也是好的,他們不能,因為幾乎可以肯定存在軟件依賴於當前實現的工作方式。
從Java 5開始,還有一個isSpaceChar(int)
方法。 那不是你想做的嗎?
確定指定的字符(Unicode代碼點)是否為Unicode空格字符。 當且僅當字符被Unicode標准指定為空格字符時,才將字符視為空格字符。 如果角色的常規類別類型是以下任何一種,則此方法返回true:...
如上所述, isSpaceChar(int)
將為OP提供跟蹤答案。 它看起來相當謹慎,但這種方法實際上可用於正則表達式 。 所以:
"X\u00A0X X".replaceAll("\\p{javaSpaceChar}", "_");
將生成一個“X_X_X”字符串。 它留給練習者讀取正則表達式以修剪字符串。 (帶有一些標志的模式應該可以解決問題。)
我認為Java的實現比.NET更正確。 不間斷的空間本質上是一個非空白字符,看起來像一個。 也就是說,如果你有字符串“foo”和“bar”,並在它們之間放置任何傳統的空白字符,你就會得到一個單詞分隔符。 然而,一個不間斷的空間並沒有打破這兩個空間。
應該特別處理不間斷空間的唯一時間是使用設計用於執行文本自動換行的代碼。
出於所有其他目的,包括字數,修剪和沿着字邊界的通用分割,不間斷的空間仍然是空白 。
任何一個非破壞性空間只是“看起來像”一個空間而不是一個空間的論點與Unicode的整個點相沖突,Unicode表示基於其含義的字符,而不是它們的顯示方式。
因此,恕我直言,String.trim()的Java實現沒有按預期執行,並且底層的Character.isWhitespace()函數有問題。
我的猜測是,Java實現者根據在控件中執行文本換行的需要編寫了isWhitespace()。 他們應該將此函數命名為isWordWrappingBoundary()或更清晰的東西,並對trim()使用限制較少的空白測試。
看起來方法名稱( isWhitespace
)與其功能(檢測分隔符)不一致。 如果您查看所引用的Javadoc頁面中的完整字符列表,“分隔符”功能就相當清楚了:
* It is a Unicode space character (SPACE_SEPARATOR, LINE_SEPARATOR, or PARAGRAPH_SEPARATOR) but is not also a non-breaking space ('\u00A0', '\u2007', '\u202F').
* It is '\u0009', HORIZONTAL TABULATION.
* It is '\u000A', LINE FEED.
* It is '\u000B', VERTICAL TABULATION.
* It is '\u000C', FORM FEED.
* It is '\u000D', CARRIAGE RETURN.
* It is '\u001C', FILE SEPARATOR.
* It is '\u001D', GROUP SEPARATOR.
* It is '\u001E', RECORD SEPARATOR.
* It is '\u001F', UNIT SEPARATOR.
非破壞空間的功能應該是不被連字算法分隔的單詞之間的可視空間。
使用具有相同奇怪的isWhitespace行為的apache commons函數StringUtils.isBlank() (及相關函數)時也要小心,即不間斷空格被認為是非空白的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.