当使用UTF-8时,为什么equalsIgnoreCase()因字母æ,ø,å而失败?

时间:2010-11-17 14:52:55

标签: java localization special-characters character-encoding

我无法打印/比较字母æøå和大写字母ÆØÅ。我的代码在Eclipse STS 2.5中的Mac OS X 10.6.4上运行,我已经将Eclipse设置为使用UTF-8而不是MacRoman。似乎equalsIgnoreCase,toUpperCase和toLowerCase都不起作用,我无法正确地将字母打印到控制台。对我失踪的任何想法?

示例:

String ae1 = "æ";
String ae2 = "Æ";
System.out.println(ae1);
System.out.println(ae2.toLowerCase());
if(ae1.equalsIgnoreCase(ae2))
 System.out.println("match");
else
 System.out.println("no match");

返回:

æ
ß
no match

4 个答案:

答案 0 :(得分:4)

嗯,目前还不清楚您处于以下哪种情况:

  • 您的字符串文字正在正确编译,equalsIgnoreCase失败,控制台失败
  • 您的字符串文字编译错误 - 一旦您获得垃圾数据,其他任何内容都无法正常工作

强烈建议您尝试使用\uxxxx格式以确保获得正确的输入数据。您可以通过打印(int) ae1.charAt(0)的值并查看哪个Unicode字符来分析当前代码。

一旦你把事情分开来确定哪个阶段失败了,你就可以适当地调整代码 - 无论是使用Collator还是其他方法。

答案 1 :(得分:3)

您的输出清楚地表明您的源文件是UTF-8,但编译器配置为将源读取为Mac OS Roman。

由于您说您将Eclipse配置为使用UTF-8,因此您的配置可能有些错误或不完整。

要确保源编码不匹配存在问题,可以使用Unicode转义替换这些字符。在这种情况下,equalsIgnoreCase()按预期工作:

String ae1 = "\u00e6"; 
String ae2 = "\u00c6"; 

答案 2 :(得分:3)

equals()不用于比较自然语言。你应该使用Collat​​or:http://java-x.blogspot.com/2006/09/javatextcollator-for-string-comparison.html

答案 3 :(得分:0)

我想我的字符串文字编译错误,因为编译器或eclipse没有正确配置,但我还没弄清楚它是什么。然而,使用\uxxxx格式确实解决了我的问题,所以我暂时将其留在那里。

如果我偶然发现一个解决方案,我会在这里发布。

感谢您的回答!