2013-06-16 4 views
1

У меня есть TextWatcher в окне EditText. Когда пользовательские типы, я устанавливаю все, что находится в окне EditText, как ярлык Button.Ввод юникода через EditText

EditText et = rootView.findViewById(R.id.userInput); 
et.addTextChangedListener(this); 
... 

@Override public void beforeTextChanged(CharSequence s, int start, int count, int after) {} 
@Override public void afterTextChanged(Editable s) {} 

@Override 
public void onTextChanged(CharSequence s, int start, int before, int count) { 
    Button btn = (Button) rootView.findViewById(R.id.myButton); 
    btn.setText(s.toString()); 
    //btn.setText("\u00A9"); 
} 

Но я не могу понять, как писать символы Юникода. Прокомментированная строка, если она не готова, устанавливает текст Button символу авторского права ©. Хотя ввод одного и того же кода юникода в поле EditText не работает. Я попытался ввести двойную обратную косую черту в EditText, все еще не очень хорошо.

Примечание: при использовании btn.setText(s) без части toString() текст на кнопке подчеркивается.

ПОДРАЗДЕЛЕНИЕ Из-за некоторых комментариев и ответов (теперь удалено) Я понимаю, что я был неясен. Позвольте мне перефразировать:

Я не хочу каким-либо образом вмешиваться в ввод текста пользователя. Сейчас, когда пользователь вводит «Hello \ u0089» в EditText, скопировать его в текст кнопки, используя следующую строку:

btn.setText(s.toString()); 

, и это показывает, как «Hello \ u0089». Я ожидал «Hello ‰». Зачем? потому что, если я бегу немного теста и использовать эту строку:

btn.setText("Hello \u0089"); 

он показывает, как «Hello ‰». Итак, какая разница, что делает unicode правильно отображаться в прямом подходе, но не показывает его, когда вводится через EditText?

+0

Непонятно, что вы пытаетесь выполнить. Вы хотите, чтобы пользователь вводил код, а затем менял код на соответствующий символ «на лету»? – ozbek

+0

@shoerat Извините за неясность. Я не хочу вмешиваться во вход пользователя. Я говорю, что когда пользователь вводит код unicode, такой как \ u2303, он не отображается как unicode. Я добавлю разъяснение по самому вопросу. – ilomambo

ответ

4

Итак, в чем разница, которая делает юникод правильно отображаться в прямом подходе, но не показывает его, когда вводится через EditText?

Аргх, я хочу, чтобы люди перестали говорить «Юникод». Это «текст», а не «юникод». Unicode является стандартом. Текст, введенный пользователем, не является стандартным, это просто текст.

С учетом этого, давайте посмотрим, могу ли я объяснить разницу.

Когда вы пишете строку буквальной как "Hello \u0089" в Java, файл исходного кода будет содержать следующую последовательность символов:

  1. U+0022 ǫᴜᴏᴛᴀᴛɪᴏɴ ᴍᴀʀᴋ;
  2. a U+0048 ʟᴀᴛɪɴ ᴄᴀᴘɪᴛᴀʟ ʟᴇᴛᴛᴇʀ ʜ;
  3. a U+0065 ʟᴀᴛɪɴ sᴍᴀʟʟ ʟᴇᴛᴛᴇʀ ᴇ;
  4. a U+006C ʟᴀᴛɪɴ sᴍᴀʟʟ ʟᴇᴛᴛᴇʀ ʟ;
  5. a U+006C ʟᴀᴛɪɴ sᴍᴀʟʟ ʟᴇᴛᴛᴇʀ ʟ;
  6. a U+006F ʟᴀᴛɪɴ sᴍᴀʟʟ ʟᴇᴛᴛᴇʀ ᴏ;
  7. a U+0020 sᴘᴀᴄᴇ;
  8. a U+005C ʀᴇᴠᴇʀsᴇ sᴏʟɪᴅᴜs (также известный как обратная косая черта);
  9. a U+0075 ʟᴀᴛɪɴ sᴍᴀʟʟ ʟᴇᴛᴛᴇʀ ᴜ;
  10. a U+0030 ᴅɪɢɪᴛ ᴢᴇʀᴏ;
  11. a U+0030 ᴅɪɢɪᴛ ᴢᴇʀᴏ;
  12. a U+0038 ᴅɪɢɪᴛ ᴇɪɢʜᴛ;
  13. a U+0039 ᴅɪɢɪᴛ ɴɪɴᴇ; и
  14. a U+0022 ǫᴜᴏᴛᴀᴛɪᴏɴ ᴍᴀʀᴋ.

Здесь нет никакой магии. То, что вы набираете, - это то, что вы получаете. Последовательность \u0089 не волшебна.

Однако, когда вы даете тот же исходный файл вашему Java-компилятору, компилятор Java имеет соглашение с вами, программист: он преобразует любую последовательность, которую он находит внутри строкового литерала, который начинается с символов U + 005C U +0075 и за ним следуют четыре шестнадцатеричных символа цифры в символ, который соответствует значению Unicode, указанному этими шестнадцатеричными цифрами. В этом соглашении также содержится положение о том, когда вы, программист, хотите на самом деле означать эту последовательность с обратной косой чертой, u и шестнадцатеричными цифрами, то есть шестью символами, а не одним. Для этого вам предшествует обратная косая черта с другой обратной косой чертой, а компилятор Java не выполняет никаких других преобразований, кроме удаления одной из этих двух обратных косых черт.

Итак, в то время как исходный файл будет иметь строковый литерал с двенадцатью символами между кавычками, компилятор Java по соглашению с программистом, установленным Спецификацией Java, преобразует его в строку с семью символами.

  1. a U+0048 ʟᴀᴛɪɴ ᴄᴀᴘɪᴛᴀʟ ʟᴇᴛᴛᴇʀ ʜ;
  2. a U+0065 ʟᴀᴛɪɴ sᴍᴀʟʟ ʟᴇᴛᴛᴇʀ ᴇ;
  3. a U+006C ʟᴀᴛɪɴ sᴍᴀʟʟ ʟᴇᴛᴛᴇʀ ʟ;
  4. a U+006C ʟᴀᴛɪɴ sᴍᴀʟʟ ʟᴇᴛᴛᴇʀ ʟ;
  5. a U+006F ʟᴀᴛɪɴ sᴍᴀʟʟ ʟᴇᴛᴛᴇʀ ᴏ;
  6. a U+0020 sᴘᴀᴄᴇ;
  7. 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(); 
} 
+0

Ничего себе! Спасибо за подробное описание! Он светился. И ответ ... ??? Что это за знаменитый код, «который делает такое преобразование»? Должно быть сделано char char или есть встроенная функция, которая выполняет преобразование? – ilomambo

+0

Я принимаю ваш ответ, хотя ему не хватает образца кода конверсии, потому что я вижу, что вы потратили время на его запись и очень помогли. Во всяком случае, не стесняйтесь редактировать его с помощью некоторых строк кода, которые могут сделать трюк, для полноты. – ilomambo

+1

Вы также можете посмотреть 'org.apache.commons.lang3.StringEscapeUtils.unescapeJava (String str)'. Он делает то же самое, что и последний блок кода, но и в отношении других других управляющих последовательностей. – Erhannis

Смежные вопросы