Как изменить шрифт, не используя методы вроде toUpperCase?

Например, чтобы при вводе "привет", на выходе было "ПРИВЕТ". Но без использования метода toUpperCase().

import java.util.*;

public class Main {
    public static void main(String args[]) {
        Scanner in = new Scanner(System.in);
        String text = in.next();
        // пробовал разные варианты, но пока не хватает знаний
    }
}

Ответы (2 шт):

Автор решения: Drakonoved

См. таблицу символов UTF-8. В ней сначала идут заглавные буквы, потом строчные. Символ char в java хранит в себе десятичное значение кода символа. Чтобы из строчной буквы получить заглавную, нужно сместить код вниз на 32 и наоборот.


Заглавные латинские буквы: A - Z ⇒ коды символов 65 - 90.
Строчные латинские буквы: a - z ⇒ коды символов 97 - 122.

Аналогичная ситуация с кириллическими буквами:

Заглавные кириллические буквы: А - Я ⇒ коды символов 1040 - 1071.
Строчные кириллические буквы: а - я ⇒ коды символов 1072 - 1103.

Отдельная история: Ё1025, ё1105.


Пример кода:

public static void main(String[] args) {
    System.out.println(toLowerCase("СЛОВА_С-БУКВОЙ Ё"));
    System.out.println(toLowerCase("UPPER=WORDS_lower*words"));

    // слова_с-буквой ё
    // upper=words_lower*words
}

private static String toLowerCase(String upperCase) {
    char[] charArr = upperCase.toCharArray();

    for (int i = 0; i < charArr.length; i++) {
        if (charArr[i] == 1025) {
            charArr[i] = 1105;
        } else if (charArr[i] >= 65 && charArr[i] <= 90
                || charArr[i] >= 1040 && charArr[i] <= 1071) {
            charArr[i] = (char) (charArr[i] + 32);
        }
    }

    return String.valueOf(charArr);
}
→ Ссылка
Автор решения: Alexander Chernin

Лучше, конечно, через кодировку, но есть и такой (наваристо-забористый) вариант:

import java.util.*;

public class Main {
    // Массив замены символов
    public static Map<char, char> map = new HashMap<>() {{
        put('а', 'А');
        put('б', 'Б');
        ...
        put('я', 'Я');
    }};

    public static void main(String args[]) {
        Scanner in = new Scanner(System.in);
        String text = in.next();

        // Выходная строка
        String output = "";
        for(int i = 0; i < text.length(); i++) {
            // Получить значение из входной строки
            char c = text.charAt(i);

            // Получить значение из массива замены
            char value = Main.map.get(c);

            // Если не Null, то прибавить к выходной строке значение (value)
            // из массива замены, иначе сам символ из входной строки
            output += value? value: c;
        }
    }
}
→ Ссылка