В чем разница между Character.toUpperCase() и Character.toTitleCase()

Я рефакторинг некоторых из моего старого кода, а затем я узнал, что я использовал Character.toTitleCase() метод в какой-то момент и не мог не задаться вопросом, если Character.toUpperCase() было бы лучше.

Я прочитал их описания и не увидел принципиальной разницы:

toUpperCase

Преобразует символьный аргумент в верхний регистр, используя информацию сопоставления регистра из файла UnicodeData. Обратите внимание, что Character.isUpperCase(Character.toUpperCase(ch)) не всегда возвращает true для некоторых диапазонов символов, особенно для символов или идеограмм.

В общем случае String.toUpperCase() следует использовать для отображения символов в верхнем регистре. Методы отображения регистра строки имеют несколько преимуществ по сравнению с методами отображения регистра символов. Методы сопоставления регистра в строковом формате могут выполнять сопоставления с учетом локали, контекстно-зависимые сопоставления и сопоставления символов 1:M, тогда как методы сопоставления символов с символами не могут.

Примечание. Этот метод не может обрабатывать дополнительные символы. Для поддержки всех символов Юникода, включая дополнительные символы, используйте метод toUpperCase(int).

а также

toTitleCase

Преобразует символьный аргумент в casecase, используя информацию сопоставления регистра из файла UnicodeData. Если символ не имеет явного сопоставления заглавных букв и сам по себе не является символом заглавных букв в соответствии с UnicodeData, тогда сопоставление в верхнем регистре возвращается как эквивалентное сопоставление заглавных букв. Если аргумент char уже является тэгом titlecase, будет возвращено то же значение char. Обратите внимание, что Character.isTitleCase(Character.toTitleCase(ch)) не всегда возвращает true для некоторых диапазонов символов.

Примечание. Этот метод не может обрабатывать дополнительные символы. Для поддержки всех символов Юникода, включая дополнительные символы, используйте метод toTitleCase(int).

Затем я попытался проверить их так:

public class Test {
  public static void main(String... args) {

    String originalString = "abcdefghijklmnopqrstuvwxyz123546-.,/*&%+";
    StringBuilder upperCaseStringBuilder = new StringBuilder();
    StringBuilder titleCaseStringBuilder = new StringBuilder();

    for (int i = 0; i < originalString.length(); i++) {
      upperCaseStringBuilder.append(Character.toUpperCase(originalString.charAt(i)));
      titleCaseStringBuilder.append(Character.toTitleCase(originalString.charAt(i)));
    }

    System.out.println("Original String : " + originalString);
    System.out.println("UpperCase result: " + upperCaseStringBuilder.toString());
    System.out.println("TitleCase result: " + titleCaseStringBuilder.toString());
  }
}

Это вывод:

Original String : abcdefghijklmnopqrstuvwxyz123546-.,/*&%+
UpperCase result: ABCDEFGHIJKLMNOPQRSTUVWXYZ123546-.,/*&%+
TitleCase result: ABCDEFGHIJKLMNOPQRSTUVWXYZ123546-.,/*&%+

Поэтому я не мог понять разницу между этими двумя методами. Как я уже говорил, я использовал toTitleCase() в моем коде, чтобы использовать для своей выгоды String,

Есть ли какое-то ключевое отличие, которое я не учел и которое может привести к тому, что мой код будет вести себя не так, как ожидалось, в некоторых особых случаях?


Примечание: я не думаю, что это дубликат строковой заглавной буквы - лучший способ. Потому что в этом вопросе проблема заключается в использовании строчных букв, а не в верхнем и верхнем регистре символов, как в этом вопросе.

2 ответа

Решение

Стандартные символы ASCII такие скучные! Вот что-то более захватывающее:

System.out.println(Character.toTitleCase('dz'));  // Dz
System.out.println(Character.toUpperCase('dz'));  // DZ

Живая демоверсия.

Я действительно не вижу здесь никаких "реальных" различий, и я думаю, что лучше не задумываться над мелкими деталями. Я хочу указать на эту единственную строку здесь, которая должна помочь с "проблемой" здесь.

В общем, String.toUpperCase() должен использоваться для отображения символов в верхнем регистре. Методы отображения регистра строки имеют несколько преимуществ по сравнению с методами отображения регистра символов.

Документация String.toUpperCase(): https://www.w3schools.com/jsref/jsref_touppercase.asp

Кто-то должен прокомментировать, если у них есть больше внутренней информации.

Другие вопросы по тегам