我目前正在做一个学校项目,需要从网站上下载数据(通过爬网)并在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Ä
。轻松解决:
预期的输出:
String data = downloadFromServer();
// Fill the gap
data = data.replace(" ", 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引起的。
答案 0 :(得分:1)
我用Gradle射中了自己的腿。经过研究,我发现Gradle默认情况下通常不会使用.java
不编译UTF-8
文件。因此,当我编译.jar
时,它意外地将ä
转换为ä
,正如在反编译的.class
文件中所见。
通过添加以下代码,解决了整个问题。
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}