通过EditText输入unicode

时间:2013-06-16 17:11:16

标签: android button unicode android-edittext

我在EditText框上有一个TextWatcher。 当用户输入时,我将EditText Box上的任何内容设置为Button标签。

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");
}

但我无法弄清楚如何编写 unicode符号。注释行在取消注释时将Button文本设置为版权符号©。虽然在EditText框中输入相同的unicode代码不起作用。 我试图在EditText中输入双反斜杠,但仍不好。

注意:与此无关,当使用btn.setText(s)而没有toString()部分时,按钮中的文字会带下划线。

澄清 由于一些评论和答案(现已删除),我意识到我不清楚。让我重新说一下:

我不想以任何方式干扰用户输入文本。现在,当用户在EditText中输入“Hello \ u0089”时,我会使用以下行将其复制到Button文本中:

btn.setText(s.toString());

并显示为“Hello \ u0089”。我期待“Hello‰”。为什么?因为如果我运行一点测试并使用这一行:

btn.setText("Hello \u0089");

显示为“Hello‰”。那么,有什么区别可以让unicode在直接方法中正确显示,但是在通过EditText输入时不会显示它?

1 个答案:

答案 0 :(得分:4)

  

那么,有什么区别可以让unicode在直接方法中正确显示,但是在通过EditText输入时不会显示它?

Arggh,我希望人们不要再说“unicode”了。它是“文本”,而不是“unicode”。 Unicode是一种标准。用户输入的文本不是一个标准,而只是文本。

有了这个,让我们看看我是否可以解释其中的差异。

在Java中编写类似"Hello \u0089"的字符串文字时,源代码文件将包含以下字符序列:

  1. a 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 ǫᴜᴏᴛᴀᴛɪᴏɴ ᴍᴀʀᴋ
  15. 这里没有魔法。你输入的内容就是你得到的。 \u0089序列并不神奇。

    但是,当您将相同的源文件提供给Java编译器时,Java编译器与您达成协议,程序员:它将转换它在字符串文字中找到的任何序列,该字符串文字以字符U + 005C U +开头0075后跟四个十六进制数字字符到与这些十六进制数字指定的Unicode值对应的字符中。该协议还包括一个规定,当程序员想要实际意味着带有反斜杠,u和十六进制数字的序列时,即六个字符,而不是一个。为此,您在反斜杠之前加上另一个反斜杠,除了删除这两个反斜杠之一外,Java编译器不会执行任何其他转换。

    因此,虽然源文件将具有引号之间带有十二个字符的字符串文字,但Java编译器将遵循与Java规范所阐述的程序员的协议,将其转换为仅包含七个字符的字符串。 / p>

    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ᴛɪғɪᴄᴀᴛɪᴏɴ;
    8. 现在,当用户在某些UI中输入文本时,他们没有输入稍后由Java编译器处理的Java字符串文字,或者是不是?

      他们不是。当用户键入反斜杠后跟一个u和一些数字时,用户会得到一个反斜杠后跟一个u和一些数字。当用户在文本字段中输入\u0089时,该文本字段包含一个包含六个字符的字符串,而不是一个字符。没有Java编译器,任何预先约定的约定用Unicode值表示字符;它只是用户输入文本而不是Java代码。

      当用户在文本字段中输入\u0089时,文本字段包含一个字符串,该字符串可以在Java源代码中表示为 "\\u0089",而不是{{1} }。

      如果您希望为这种用户输入赋予Java编译器为这些Unicode转义序列赋予的相同含义,则需要在显示之前调用执行此类转换的代码。

      FOR COMPLETENESS 这是我根据上面的答案写的OP发布代码。

      "\u0089"