umlaute(äöü)的奇异编码

时间:2018-09-16 18:26:40

标签: java android gradle

我目前正在做一个学校项目,需要从网站上下载数据(通过爬网)并在Android应用程序中处理/显示。下载的数据通常包含$checkIfExists = "SELECT COUNT(*) AS count FROM panels WHERE panel_type_id = $panelID AND page_id = $pageID"; if($mysqlConn->query($checkIfExists)->count = 0){ $q= " INSERT INTO panels(panel_type_id, page_id, cont_id) VALUES ('$panelID', '$pageID', '$cont_id'); "; } else { $q= " UPDATE panels SET cont_id = $cont_id WHERE panel_type_id = $panelID AND page_id = $pageID "; } if ($mysqlConn->query($q) === TRUE) { echo "New record created successfully"; } else { echo "Error: " . $addPanel . "<br>" . $mysqlConn->error; } 之类的字母,可以毫无疑问地完美显示在ä中。

有时候,我收到的数据有空白,我的解析器在下载后会填充这些空白。它不显示TextView,而是显示textThatContainsÄ。轻松解决:

&nbsp;

预期的输出:

String data = downloadFromServer();

// Fill the gap
data = data.replace("&nbsp;", textThatContainsÄ);

我在上面编写的逻辑被打包到Output: [..]ä[..] 中,并导入到我的Android应用中。由于封装原因,我下载的数据在Android应用中不会受到任何影响。

现在转弯了。如果从服务器下载的数据确实最初包含.jar(因此我的解析器必须填补空白),Android会将其解释为textThatContainsÄ,这显然是{{ 1}}编码问题,是由于将textThatContainsä字节视为UTF-8字节而引起的(Android将文本解释为21而不是18字节(文本的大小为9))。如果数据最初包含UTF-8,则不会发生此问题。

我不知道为什么Java代码生成的Windows-1252 (or ISO 8859-1)在Android中会导致编码问题。

编辑:是由Gradle引起的。

1 个答案:

答案 0 :(得分:1)

我用Gradle射中了自己的腿。经过研究,我发现Gradle默认情况下通常不会使用.java 编译UTF-8文件。因此,当我编译.jar时,它意外地将ä转换为ä,正如在反编译的.class文件中所见。

通过添加以下代码,解决了整个问题。

tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
}