Java的toLowerCase()是否保留原始字符串长度?

Mic*_*Sim 28 java string string-length

假设有两个Java String对象:

String str = "<my string>";
String strLower = str.toLowerCase();
Run Code Online (Sandbox Code Playgroud)

对于<my string>表达式的每个值,它是否正确呢?

str.length() == strLower.length()
Run Code Online (Sandbox Code Playgroud)

评估到true

那么,是否String.toLowerCase()为String的任何值保留原始字符串长度?

cod*_*ict 44

令人惊讶的是它没有 !!

从Java文档到toLowerCase

使用给定Locale的规则将此String中的所有字符转换为小写.案例映射基于Character类指定的Unicode标准版本.由于大小写映射并不总是1:1的char映射,因此生成的String可能与原始String的长度不同.

例:

package com.stackoverflow.q2357315;

import java.util.Locale;

public class Test {
    public static void main(String[] args) throws Exception {
        Locale.setDefault(new Locale("lt"));
        String s = "\u00cc";
        System.out.println(s + " (" + s.length() + ")"); // Ì (1)
        s = s.toLowerCase();
        System.out.println(s + " (" + s.length() + ")"); // i?? (3)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @BalusC:关于在区域设置AZ,LT和TR中组合字符有一些奇特的规则,请参阅`java/lang/ConditionalSpecialCasing.java`.例如,``\ u00cc".toLowerCase(new Locale("lt")).length()== 3` (7认同)
  • 你能说出一些例子吗?我知道有几个例子可以使上层变体的大小与下层变体的大小不同,例如`ß`将成为`SS`,但不会反过来. (5认同)
  • 很酷,感谢指针.在这个答案中,我可以自由编辑SSCCE. (2认同)