我目前正在制作一个学校项目,我需要从网站下载数据(通过抓取)并在Android应用中处理/显示它。下载的数据通常包含像ä
这样的字母,可以毫无疑问地在TextView
中完美显示。
有时,我收到的数据有差距,我的解析器在下载后会填充。它不显示textThatContainsÄ
,而是显示
。轻松修复:
String data = downloadFromServer();
// Fill the gap
data = data.replace(" ", textThatContainsÄ);
输出如预期:
Output: [..]ä[..]
我上面写的逻辑被打包成一个.jar
并导入我的Android应用程序。由于封装,我下载的数据在Android应用程序中不受任何影响。
现在来了扭曲。如果从服务器下载的数据最初不包含textThatContainsÄ
(这样我的解析器必须填补空白)Android将其解释为textThatContainsä
,这显然是一个UTF-8
编码问题,这是由于将UTF-8
字节视为Windows-1252 (or ISO 8859-1)
字节(Android)将文本解释为21而不是18个字节(文本大小为9))。如果数据最初包含ä
,则不会发生此问题。
我不知道为什么java代码生成的ä
会在Android中产生编码问题。
编辑:是由Gradle引起的。
我使用Gradle拍摄自己的腿。经过一些研究,我发现Gradle通常不会默认使用.java
编译UTF-8
文件。因此,当我编译.jar
时,它意外地将ä
翻译成ä
,正如我在反编译的.class
文件中看到的那样。
通过添加下面的代码,整个问题得以解决。
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}