Java中的toLowerCase()方法与Locale一起使用时不会产生精确的结果

Java中的toLowerCase()方法与Locale一起使用时不会产生精确的结果,java,locale,setlocale,Java,Locale,Setlocale,查看以下Java代码片段 final public class Main { public static void main(String[] args) { Locale.setDefault(new Locale("lt")); String str = "\u00cc"; //setting Lithuanian as locale System.out.println("Before case conversion

查看以下Java代码片段

final public class Main
{
    public static void main(String[] args) 
    {
        Locale.setDefault(new Locale("lt")); 
        String str = "\u00cc";   //setting Lithuanian as locale

        System.out.println("Before case conversion is "+str+" and length is "+str.length());// Ì
        String lowerCaseStr = str.toLowerCase();
        System.out.println("Lower case is "+lowerCaseStr+" and length is "+lowerCaseStr.length());// i?`
    }
}

它显示以下输出

大小写转换前为Ì,长度为1

小写字母为i̇̀,长度为3



在第一个
System.out.println()语句中,结果是准确的。但是,在第二条语句中,它显示了长度3,实际上应该是1。我不明白,为什么?

不同的语言有不同的规则转换成大写或小写

例如,在德语中,小写字母ß变成两个大写字母,因此6个字符长的单词“straße”(街道)变成了7个字符长的“STRASSE”

这就是为什么上下套管的字符串有不同的长度

我在一次Java测试中写到了这一点:
我得到了一个不同的结果:

Before case conversion is Ì and length is 1
Lower case is i?? and length is 3
这完全是我的翻版。这是非常有帮助的,并且有非常详细的答案。 str和str.toLowerCase()的长度并不总是相同的,因为会话取决于每个字符的代码


在这种情况下,第二个输出是“小写为
i???
,长度为3”。它后面跟着两个?标记长度为3。

尝试将
小写字母中的3个字符中的每一个显示为十六进制数。我得到的结果与NetBeans 6.9.1中问题本身提到的结果相同。可以肯定,这些不是真正的问号;它们是由于字符编码问题而显示为问号的重音符号。