Escape-последовательности переменных в java

Возьмем пример:

System.out.println("Hello  Uni\u03C0");
System.out.println("Hello Esc \\");

это дает что-то вроде

Привет Uniπ

Привет Esc \

Есть ли способ, которым я могу дать разные значения 03C0 и \ во время разных итераций в цикле?

например что-то вроде

System.out.format("Hello Esc \%c",'\\');
System.out.format("Hello Esc \%c",'\"');

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

Например, я хотел бы печатать разные символы Юникода (скажем, от до Ã) на каждой итерации цикла.

Например, у меня есть эта функция, которая возвращает 4-значное шестнадцатеричное значение целого числа:

public static String hexa(int a)
    {
    int x=a;
    String b= String.format("%x",x);
    if(b.length() == 1)
    {
    b="000"+b;
    }
    if(b.length() == 2)
    {
    b="00"+b;
    }
     if(b.length() == 3)
    {
    b="0"+b;
    }
    return b;
    }

Теперь я хотел бы присоединиться к \u с hexa(i), чтобы получить другой символ юникода для разных i


person user3015246    schedule 22.11.2013    source источник
comment
НЕТ ответов? Я очень хотел узнать, как это можно сделать.   -  person user3015246    schedule 22.11.2013


Ответы (1)


Вам даже не нужно преобразовывать целое число в шестнадцатеричную строку. Оставьте его целым и используйте Character.toChars()

    StringBuilder sb = new StringBuilder();
    sb.append(Character.toChars(0x03C0));
    System.out.println(sb.toString());

Дальнейший пример, показывающий цикл for:

public static void main(String [] args) {
    String lineSeparator = System.lineSeparator();
    StringBuilder sb = new StringBuilder();

    for(int i = 0x03C0; i < 0x03D0; i++) {
        sb.append(Character.toChars(i)).append(lineSeparator);
    }

    System.out.println(sb.toString());
}

Вывод:

π
ρ
ς
σ
τ
υ
φ
χ
ψ
ω
ϊ
ϋ
ό
ύ
ώ
Ϗ

Последнее уточнение:

System.out.println(Character.toChars(0x03C0)[0] == '\u03C0');

Вывод:

true

Пример без StringBuilder:

String foo = "";
for(char c : Character.toChars(0x03C0)) {
    foo += c;
}
System.out.println(foo);
person Pace    schedule 22.11.2013
comment
Я не понимаю, как это решает мою проблему? Я хочу сказать System.out.print(\u(VARIABLE)); Как добавить переменную в \u или \ - person user3015246; 22.11.2013
comment
Вам не нужны \u или \. Все, что нужно сделать, это преобразовать исходный код в символ. Если вы запустите мой пример, вы увидите, что он печатает символ pi. Я изменю его, чтобы добавить цикл for. - person Pace; 23.11.2013
comment
БОЛЬШОЕ СПАСИБО! Это более или менее то, что мне было нужно. Единственная проблема в том, что я не очень хорошо знаком с методами класса StringBuilder. Что делает append()? и я думаю, я могу объявить целое число в десятичном формате с префиксом 0x? - person user3015246; 23.11.2013
comment
Это было просто удобство. Я добавлю пример без него. - person Pace; 23.11.2013
comment
Я сделал это так: for(i=20;i‹20000;i++) { f=(char)(i); System.out.println(\\u+hexa(i) + = + i+ = +f+\n); } - person user3015246; 23.11.2013
comment
StringBuilder похоже на добавление строк с помощью +, но намного эффективнее, если у вас есть несколько дополнений. Это связано с тем, как Java внутренне реализует дополнительный материал. Сначала вы создаете пустой экземпляр с new StringBuilder(), затем добавляете свои String с sb.append(first).append(second) и так далее. И в итоге вы получите окончательный результат String с sb.toString(). Просто избегайте использования first + second + ..., потому что, как было сказано, это может быть намного дороже. Однако в этом ответе я не вижу пользы от его использования, он даже будет немного медленнее. - person Zabuzard; 16.08.2017
comment
Однако я думаю, что @Pace хотел создать одну строку с помощью этого Builder вместо создания новой версии на каждой итерации. Я думаю, что это опечатка, особенно если посмотреть на его вариант без сборки. И если это было целью, то StringBuilder снова пригодится. - person Zabuzard; 16.08.2017
comment
@Zabuza Даже я не знаю, что Пейс хотел сделать 5 лет назад. Не знаю, что за опечатка, но с удовольствием исправлю. Я считаю, что создаю одну строку. - person Pace; 16.08.2017
comment
О, этот пост действительно довольно старый ... только что понял это. Я отредактировал ваш пост, взгляните на предыдущую версию. Там вы создали один StringBuilder на каждой итерации. - person Zabuzard; 16.08.2017
comment
Не понял, что вы его отредактировали, да, я полностью согласен с вашим редактированием. Спасибо! - person Pace; 17.08.2017