您好,我目前对charsets的状态以及如何在Android中最好地处理它们感到困惑。消息来源似乎也提供了相互矛盾的信息。
1)根据这篇文章,Java JVM默认为UTF-16
Laravel's documentation
2)根据这篇文章,Java JVM(在Android下)默认为UTF-8
What is the Java's internal represention for String? Modified UTF-8? UTF-16?
Android default character encoding
1)我有一个minSdkVersion 17
的Android应用程序。
2)它的gradle
文件/ manifest
文件/任何文件中没有任何设置,指定有关字符集或编码的任何首选项。
3)它使用来自AppCompatEditText
的{{1}}和AppCompatTextView
,其中一些约束为xml属性com.android.support:appcompat-v7
4)使用android:maxLength="140"
获取内容的代码。
5)使用String myText = myView.getText().toString();
设置内容的代码。
6)使用myView.setText(myText);
来衡量内容的代码。 (e.i.更新"剩余字符"根据myText.length();
查看)
基本上这个android:maxLength="140"
连接到remaining.setText(String.valueOf(140 - myText.length()));
事件监听器
1)一种标准化Java和Android的方法,以便为我的应用程序使用相同的字符集(强制它们使用TextWatcher.onTextChanged
或UTF-16
- 我不想处理奇怪的问题使用2个不同的字符集可能会产生的极端情况(或者如果用户将默认值设置为不同的字体 - 他们甚至可以这样做吗?IDK在AAAAAAAAAH上会发生什么)
2)一种标准化UTF-8
和android:maxLength="140"
行为的方法 - 我不知道Android在remaining.setText(String.valueOf(140 - myText.length()));
下做了什么,我需要确保{由于android:maxLength
可能不会使用remaining.setText(String.valueOf(140 - myText.length()));
,而是使用其他一些奇怪的代码点测量系统,因此{1}}不会返回否定值。
3)一种正确编码和解码来自HTTPS的android:maxLength
数据到后端Django服务器的方法。
如果问题不好或含糊,请抱歉。我现在真的只是在地狱里溺水了。我只需要某种直接的清单来制作东西" work"现在在Android中......
答案 0 :(得分:1)
Android JVM仍然是Java JVM,因此它必须遵循Java规范,该规范说char
是2个字节而String
使用UTF-16作为其公共接口,不管内存中字符数据的内部表示。彼得对你所链接的What is the Java's internal represention for String? Modified UTF-8? UTF-16?的回答中说明了这一点。
Charsets不适用于String
- 仅限操作,例如访问字符,分配String
值等.Java app中的所有内容都是UTF-16。 Charsets仅在String
和字节之间转换时应用于序列化操作,例如在文件I / O,网络I / O等期间。String
数据进入/离开Java应用程序的事情。