Итак, в чем разница, которая делает юникод правильно отображаться в прямом подходе, но не показывает его, когда вводится через EditText?
Аргх, я хочу, чтобы люди перестали говорить «Юникод». Это «текст», а не «юникод». Unicode является стандартом. Текст, введенный пользователем, не является стандартным, это просто текст.
С учетом этого, давайте посмотрим, могу ли я объяснить разницу.
Когда вы пишете строку буквальной как "Hello \u0089"
в Java, файл исходного кода будет содержать следующую последовательность символов:
- U+0022 ǫᴜᴏᴛᴀᴛɪᴏɴ ᴍᴀʀᴋ;
- a U+0048 ʟᴀᴛɪɴ ᴄᴀᴘɪᴛᴀʟ ʟᴇᴛᴛᴇʀ ʜ;
- a U+0065 ʟᴀᴛɪɴ sᴍᴀʟʟ ʟᴇᴛᴛᴇʀ ᴇ;
- a U+006C ʟᴀᴛɪɴ sᴍᴀʟʟ ʟᴇᴛᴛᴇʀ ʟ;
- a U+006C ʟᴀᴛɪɴ sᴍᴀʟʟ ʟᴇᴛᴛᴇʀ ʟ;
- a U+006F ʟᴀᴛɪɴ sᴍᴀʟʟ ʟᴇᴛᴛᴇʀ ᴏ;
- a U+0020 sᴘᴀᴄᴇ;
- a U+005C ʀᴇᴠᴇʀsᴇ sᴏʟɪᴅᴜs (также известный как обратная косая черта);
- a U+0075 ʟᴀᴛɪɴ sᴍᴀʟʟ ʟᴇᴛᴛᴇʀ ᴜ;
- a U+0030 ᴅɪɢɪᴛ ᴢᴇʀᴏ;
- a U+0030 ᴅɪɢɪᴛ ᴢᴇʀᴏ;
- a U+0038 ᴅɪɢɪᴛ ᴇɪɢʜᴛ;
- a U+0039 ᴅɪɢɪᴛ ɴɪɴᴇ; и
- a U+0022 ǫᴜᴏᴛᴀᴛɪᴏɴ ᴍᴀʀᴋ.
Здесь нет никакой магии. То, что вы набираете, - это то, что вы получаете. Последовательность \u0089
не волшебна.
Однако, когда вы даете тот же исходный файл вашему Java-компилятору, компилятор Java имеет соглашение с вами, программист: он преобразует любую последовательность, которую он находит внутри строкового литерала, который начинается с символов U + 005C U +0075 и за ним следуют четыре шестнадцатеричных символа цифры в символ, который соответствует значению Unicode, указанному этими шестнадцатеричными цифрами. В этом соглашении также содержится положение о том, когда вы, программист, хотите на самом деле означать эту последовательность с обратной косой чертой, u и шестнадцатеричными цифрами, то есть шестью символами, а не одним. Для этого вам предшествует обратная косая черта с другой обратной косой чертой, а компилятор Java не выполняет никаких других преобразований, кроме удаления одной из этих двух обратных косых черт.
Итак, в то время как исходный файл будет иметь строковый литерал с двенадцатью символами между кавычками, компилятор Java по соглашению с программистом, установленным Спецификацией Java, преобразует его в строку с семью символами.
- a U+0048 ʟᴀᴛɪɴ ᴄᴀᴘɪᴛᴀʟ ʟᴇᴛᴛᴇʀ ʜ;
- a U+0065 ʟᴀᴛɪɴ sᴍᴀʟʟ ʟᴇᴛᴛᴇʀ ᴇ;
- a U+006C ʟᴀᴛɪɴ sᴍᴀʟʟ ʟᴇᴛᴛᴇʀ ʟ;
- a U+006C ʟᴀᴛɪɴ sᴍᴀʟʟ ʟᴇᴛᴛᴇʀ ʟ;
- a U+006F ʟᴀᴛɪɴ sᴍᴀʟʟ ʟᴇᴛᴛᴇʀ ᴏ;
- a U+0020 sᴘᴀᴄᴇ;
- a U+0089 ᴄʜᴀʀᴀᴄᴛᴇʀ ᴛᴀʙᴜʟᴀᴛɪᴏɴ ᴡɪᴛʜ ᴊᴜsᴛɪғɪᴄᴀᴛɪᴏɴ;
Теперь, когда пользователь вводит текст в некоторый пользовательский интерфейс, они не вводят строковые литералы Java, которые позже будут обрабатываться компилятором Java, или они?
Это не так.Когда пользователь вводит обратную косую черту, за которой следуют u и некоторые цифры, пользователь получает обратную косую черту, за которой следуют u и некоторые цифры. Когда пользователь вводит \u0089
в текстовое поле, это текстовое поле содержит строку с шестью символами, а не одно. Там нет компилятора Java с любым заранее согласованным соглашением для представления символов по их значениям Unicode; это всего лишь пользователь, вводящий текст, а не код Java.
Когда пользователь вводит \u0089
в текстовом поле, текстовые поля содержит строку, которая может быть представлена в Java исходного кода в "\\u0089"
, не "\u0089"
.
Если вы хотите присвоить этому типу пользовательского ввода то же значение, что и компилятор Java, который дает эти escape-последовательности Unicode, вам нужно вызвать код, который делает такое преобразование перед его отображением.
ДЛЯ ЗАПОЛНЕНИЯ Это код проводки OP, который я написал, основываясь на ответе выше.
public static String convertUnicode(CharSequence s) {
StringBuffer result = new StringBuffer();
Matcher m = Pattern.compile("\\\\u([0-9a-zA-Z]{4,4})\\b").matcher(s);
while (m.find()) {
char c = (char) Integer.parseInt(m.group(1), 16);
m.appendReplacement(result, String.valueOf(c));
}
m.appendTail(result);
return result.toString();
}
Непонятно, что вы пытаетесь выполнить. Вы хотите, чтобы пользователь вводил код, а затем менял код на соответствующий символ «на лету»? – ozbek
@shoerat Извините за неясность. Я не хочу вмешиваться во вход пользователя. Я говорю, что когда пользователь вводит код unicode, такой как \ u2303, он не отображается как unicode. Я добавлю разъяснение по самому вопросу. – ilomambo