假设两个Java串的对象:

String str = "<my string>";
String strLower = str.toLowerCase();

它是那么真实,对于每一个的价值 <my string> 表达

str.length() == strLower.length()

计算结果为 true?

因此,不 String.toLowerCase() 保留原来的字符串的长度对于任何价值的串?

有帮助吗?

解决方案

令人惊讶的是它不会 !!

从Java docs的 toLowerCase

将所有的人物在这串的情况下使用的规则所给予的区域设置。情况映射是基于Unicode的标准版本规定的性质类。 因为映射的情况下并不总是1:1char映射,导致串可能有不同长度比原来串。

例如:

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)
    }
}

其他提示

首先,我想指出,我完全同意,与(目前最高级)的答复@codaddict.

但是我想做一个实验,因此,这里是:

这不是一个正式的证据,但这个代码然对我而没有达到内侧 if (使用JAVA1.6.0更新月16Ubuntu):

编辑: 这里的一些更新的代码,用于处理选择,以及:

import java.util.Locale;

public class ToLowerTester {
    public final Locale locale;

    public ToLowerTester(final Locale locale) {
        this.locale = locale;
    }

    public String findFirstStrangeTwoLetterCombination() {
        char[] b = new char[2];
        for (char c1 = 0; c1 < Character.MAX_VALUE; c1++) {
            b[0] = c1;
            for (char c2 = 0; c2 < Character.MAX_VALUE; c2++) {
                b[1] = c2;
                final String string = new String(b);
                String lower = string.toLowerCase(locale);
                if (string.length() != lower.length()) {
                    return string;
                }
            }
        }
        return null;
    }
    public static void main(final String[] args) {
        Locale[] locales;
        if (args.length != 0) {
            locales = new Locale[args.length];
            for (int i=0; i<args.length; i++) {
                locales[i] = new Locale(args[i]);
            }
        } else {
            locales = Locale.getAvailableLocales();
        }
        for (Locale locale : locales) {
            System.out.println("Testing " + locale + "...");
            String result = new ToLowerTester(locale).findFirstStrangeTwoLetterCombination();
            if (result != null) {
                String lower = result.toLowerCase(locale);
                System.out.println("Found strange two letter combination for locale "
                    + locale + ": <" + result + "> (" + result.length() + ") -> <"
                    + lower + "> (" + lower.length() + ")");
            }
        }
    }
}

运行,代码用的地区名称中提到的接受答案将打印的一些例子。它没有一个论点将会尝试所有可用的选择(并采取相当长一段时间!).

这不是广泛的,因为理论上可能有多字符串的行为不同,但这是一个良好的第一近似值。

还注意到,许多两个字符的组合产生这种方式可能是无效的UTF-16,因此实际上没有发生爆炸,在这个码只能归咎于一个非常强大的串API。

最后但并非最不重要的:即使假设是真的当前实施爪哇,那可以容易地改变后的未来版本Java实现的未来版本码标准,其中的规则对新人物可以介绍情况这不再拥有真实的。

因此,根据这仍然是一个非常糟糕的主意。

还记得toUpperCase()没有保留的长度。例如:"straße"变为"大街"为德国的区域设置。所以你们或多或少拧如果你的工作与的情况下敏感弦,你需要存储指数的东西。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top