Java 为什么equalsIgnoreCase()对字母æ;失败øå;当使用UTF-8时?
我无法打印/比较字母æå与大写字母ÆØ。我的代码运行在EclipseST2.5中的MacOSX10.6.4上,我已经将Eclipse设置为使用UTF-8而不是MacRoman。看起来,无论是等号signorecase、toUpperCase还是toLowerCase都不起作用,而且我无法将这些字母正确地打印到控制台上。你知道我错过了什么吗 例如:Java 为什么equalsIgnoreCase()对字母æ;失败øå;当使用UTF-8时?,java,localization,special-characters,character-encoding,Java,Localization,Special Characters,Character Encoding,我无法打印/比较字母æå与大写字母ÆØ。我的代码运行在EclipseST2.5中的MacOSX10.6.4上,我已经将Eclipse设置为使用UTF-8而不是MacRoman。看起来,无论是等号signorecase、toUpperCase还是toLowerCase都不起作用,而且我无法将这些字母正确地打印到控制台上。你知道我错过了什么吗 例如: String ae1 = "æ"; String ae2 = "Æ"; System.out.println(ae1); System.out.pri
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
您的输出清楚地表明您的源文件是UTF-8,但编译器被配置为以Mac OS Roman的形式读取源文件 既然您说您将Eclipse配置为使用UTF-8,那么您的配置可能有点错误或不完整 为了确保这是源编码不匹配的问题,可以用Unicode转义替换这些字符。在这种情况下,
equalsIgnoreCase()
按预期工作:
String ae1 = "\u00e6";
String ae2 = "\u00c6";
equals()不是用来比较自然语言的。您应该使用Collator:嗯,您完全不清楚您处于以下哪种情况:
- 正在正确编译字符串文本,
失败,控制台失败equalsIgnoreCase
- 您的字符串文本被错误地编译了——一旦您得到了垃圾数据,其他任何东西都不会起作用
\uxxx
格式,以确保获得正确的输入数据。您可以通过打印出(int)ae1.charAt(0)
的值并查看是哪个Unicode字符来分析当前代码
一旦你把事情分离出来,确定哪一个阶段失败了,你就可以适当地调整代码——无论是使用
Collator
还是其他方法。我猜我的字符串文本被错误地编译了,因为编译器或eclipse配置不正确,但我还没弄明白是什么。不过,使用\uxxx
格式确实解决了我的问题,所以我现在就不谈这个了
如果我偶然发现一个解决方案,我会把它贴在这里
谢谢你的回答 ApacheStringutils做什么?