如何在Android中正确处理字符串长度和编码?

时间:2018-01-11 19:08:02

标签: java android encoding utf-8 character-encoding

我对此感到困惑

您好,我目前对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.onTextChangedUTF-16 - 我不想处理奇怪的问题使用2个不同的字符集可能会产生的极端情况(或者如果用户将默认值设置为不同的字体 - 他们甚至可以这样做吗?IDK在AAAAAAAAAH上会发生什么)

2)一种标准化UTF-8android: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中......

1 个答案:

答案 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应用程序的事情。