2011-05-18 133 views
1

好的,所以我覺得這個問題被問了很多次,但我無法找到答案。我正在比較兩個不同程序生成的兩個不同文件。當然,這兩個程序都是從相同的db查詢生成文件。我遇到以下區別:java字符串unicode代碼點轉換爲字符

S1 = Samsung - Mobile USB Chargers

S2 = Samsung \u2013 Mobile USB Chargers

如何轉換S2到S1,甚至更好,我該怎麼辦比較兩者沒有區別?在廣泛的互聯網上有人提到使用ApacheCommons-lang的StringUtils類,但我找不到任何有用的東西。

+1

請注意,第一個字符串有一個ASCII連字符(HYPHEN-MINUS),而第二個字符串有一個EN-DASH。 – ninjalj 2011-05-18 22:15:40

+0

嗯,所以你說的是兩個字符串不能以任何簡單的方式比較,除了做某種查詢表? – 2011-05-18 23:31:29

回答

2

您可以使用Dash_Punctuation property摺疊所有字符。

這段代碼打印true

boolean equal = "Samsung \u2013 Mobile USB Chargers" 
        .replaceAll("\\p{Pd}", "-") 
        .equals("Samsung - Mobile USB Chargers"); 
System.out.println(equal); 

注意,這將適用於所有角色與該屬性(如〰 U + 3030 WAVY DASH)。具有Dash_Punctuation(Pd)屬性的完整字符列表在UnicodeData.txt中。 Java 6支持Unicode 4.有關標點符號的討論,請參見chapter 6

+0

非常有趣。我認爲這讓我更接近我的答案,我會繼續研究。現在,我會給你接受的答案,並閱讀你分享的這個unicode鏈接。 – 2011-05-19 00:01:31

+0

@Mohamed Nuur - 我對我的帖子做了一些更正;第6章中提到的一些破折號字符(如TILDE U + 007E)沒有Pd屬性。 – McDowell 2011-05-19 00:14:02

1

生成第一個字符串的程序使用字符替換回退機制以ASCII格式寫入該文件。第二個是用Unicode編寫文件。

這些可以通過使用相同的回退機制在ASCII中創建第二個文件的副本進行比較。

最好的解決方案是修改第一個程序,以便它也使用Unicode。

(這可能是第二個文件是使用比Unicode的其他東西,因爲一些其他字符集包括破折號。如果是這樣,那麼最好的解決辦法是寫在Unicode的這兩個文件,如果可能的話)。

+0

無法更改任何輸出。是的,一個是寫在unicode,而另一個是ascii我相信。雖然我不是100%確定的。基本上一個是傳統的C++應用程序,而另一個是Java應用程序。所以我們注意到由於unicode字符/代碼點而導致的許多更改。忽略這些變化的最好方法是什麼? – 2011-05-18 23:38:51

相關問題