情况:有一个Java ESB,它从Vaadin Web表单获取输入(姓氏),并且在将其保存到数据库之前应保证将其大写。

我被分配去调查一个报告的问题,DB中有时会出现小写字符。我了解到,在通过EntityManager保存数据之前,该程序正在使用String.toUpperCase()(这是修改接收到的数据的唯一位置)。

所以我想知道的是,这是否足够。到目前为止,我还没有发现与toUpperCase()函数相关的任何“知名”问题,但我想确定。

那么问题来了-String.toUpperCase()始终会发挥作用吗?或者是否有任何可能的字符或情况出现错误并且字母不大写?

最佳答案

Java String.toUpperCase()会失败吗?


这取决于您是否传递区域设置敏感的字符串(请参见下文)。



Java.lang.String的实现中,它仅使用默认语言环境:

public String toUpperCase() {
    return toUpperCase(Locale.getDefault());
}


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


  此方法对语言环境敏感,并且如果用于旨在独立解释语言环境的字符串,则可能会产生意外的结果。示例包括编程语言标识符,协议密钥和HTML标签。
  
  要获得对语言环境不敏感的字符串的正确结果,请使用toUpperCase(Locale.ENGLISH)。


如果您对如何实现toUpperCase(Locale)感兴趣:

public String toUpperCase(Locale locale) {
    if (locale == null) {
        throw new NullPointerException();
    }

    int firstLower;
    final int len = value.length;

    /* Now check if there are any characters that need to be changed. */
    scan: {
        for (firstLower = 0 ; firstLower < len; ) {
            int c = (int)value[firstLower];
            int srcCount;
            if ((c >= Character.MIN_HIGH_SURROGATE)
                    && (c <= Character.MAX_HIGH_SURROGATE)) {
                c = codePointAt(firstLower);
                srcCount = Character.charCount(c);
            } else {
                srcCount = 1;
            }
            int upperCaseChar = Character.toUpperCaseEx(c);
            if ((upperCaseChar == Character.ERROR)
                    || (c != upperCaseChar)) {
                break scan;
            }
            firstLower += srcCount;
        }
        return this;
    }

    /* result may grow, so i+resultOffset is the write location in result */
    int resultOffset = 0;
    char[] result = new char[len]; /* may grow */

    /* Just copy the first few upperCase characters. */
    System.arraycopy(value, 0, result, 0, firstLower);

    String lang = locale.getLanguage();
    boolean localeDependent =
            (lang == "tr" || lang == "az" || lang == "lt");
    char[] upperCharArray;
    int upperChar;
    int srcChar;
    int srcCount;
    for (int i = firstLower; i < len; i += srcCount) {
        srcChar = (int)value[i];
        if ((char)srcChar >= Character.MIN_HIGH_SURROGATE &&
            (char)srcChar <= Character.MAX_HIGH_SURROGATE) {
            srcChar = codePointAt(i);
            srcCount = Character.charCount(srcChar);
        } else {
            srcCount = 1;
        }
        if (localeDependent) {
            upperChar = ConditionalSpecialCasing.toUpperCaseEx(this, i, locale);
        } else {
            upperChar = Character.toUpperCaseEx(srcChar);
        }
        if ((upperChar == Character.ERROR)
                || (upperChar >= Character.MIN_SUPPLEMENTARY_CODE_POINT)) {
            if (upperChar == Character.ERROR) {
                if (localeDependent) {
                    upperCharArray =
                            ConditionalSpecialCasing.toUpperCaseCharArray(this, i, locale);
                } else {
                    upperCharArray = Character.toUpperCaseCharArray(srcChar);
                }
            } else if (srcCount == 2) {
                resultOffset += Character.toChars(upperChar, result, i + resultOffset) - srcCount;
                continue;
            } else {
                upperCharArray = Character.toChars(upperChar);
            }

            /* Grow result if needed */
            int mapLen = upperCharArray.length;
            if (mapLen > srcCount) {
                char[] result2 = new char[result.length + mapLen - srcCount];
                System.arraycopy(result, 0, result2, 0, i + resultOffset);
                result = result2;
            }
            for (int x = 0; x < mapLen; ++x) {
                result[i + resultOffset + x] = upperCharArray[x];
            }
            resultOffset += (mapLen - srcCount);
        } else {
            result[i + resultOffset] = (char)upperChar;
        }
    }
    return new String(result, 0, len + resultOffset);
}

关于java - Java String.toUpperCase()会失败吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35622834/

10-10 16:31