2011-05-18 139 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

相关问题