我在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输入时不会显示它?
答案 0 :(得分:4)
那么,有什么区别可以让unicode在直接方法中正确显示,但是在通过EditText输入时不会显示它?
Arggh,我希望人们不要再说“unicode”了。它是“文本”,而不是“unicode”。 Unicode是一种标准。用户输入的文本不是一个标准,而只是文本。
有了这个,让我们看看我是否可以解释其中的差异。
在Java中编写类似"Hello \u0089"
的字符串文字时,源代码文件将包含以下字符序列:
这里没有魔法。你输入的内容就是你得到的。 \u0089
序列并不神奇。
但是,当您将相同的源文件提供给Java编译器时,Java编译器与您达成协议,程序员:它将转换它在字符串文字中找到的任何序列,该字符串文字以字符U + 005C U +开头0075后跟四个十六进制数字字符到与这些十六进制数字指定的Unicode值对应的字符中。该协议还包括一个规定,当程序员想要实际意味着带有反斜杠,u和十六进制数字的序列时,即六个字符,而不是一个。为此,您在反斜杠之前加上另一个反斜杠,除了删除这两个反斜杠之一外,Java编译器不会执行任何其他转换。
因此,虽然源文件将具有引号之间带有十二个字符的字符串文字,但Java编译器将遵循与Java规范所阐述的程序员的协议,将其转换为仅包含七个字符的字符串。 / p>
现在,当用户在某些UI中输入文本时,他们没有输入稍后由Java编译器处理的Java字符串文字,或者是不是?
他们不是。当用户键入反斜杠后跟一个u和一些数字时,用户会得到一个反斜杠后跟一个u和一些数字。当用户在文本字段中输入\u0089
时,该文本字段包含一个包含六个字符的字符串,而不是一个字符。没有Java编译器,任何预先约定的约定用Unicode值表示字符;它只是用户输入文本而不是Java代码。
当用户在文本字段中输入\u0089
时,文本字段包含一个字符串,该字符串可以在Java源代码中表示为 "\\u0089"
,而不是{{1} }。
如果您希望为这种用户输入赋予Java编译器为这些Unicode转义序列赋予的相同含义,则需要在显示之前调用执行此类转换的代码。
FOR COMPLETENESS 这是我根据上面的答案写的OP发布代码。
"\u0089"