最后,我在所有应用程序中都解决了问题。实际上,这些问题归结为 3 个不同的原因,我将在下面列出所有这些原因,以便我的这一发现可以在未来对人们有所帮助。
原因 1: 用户创建的文件编码不正确。
这实际上是我在问题中发布的应用程序的问题。问题是我用于在数据库中引入值的插入脚本的编码是“UTF8 without BOM”。我使用Notepad++ 将此编码转换为“UTF8”并重新插入数据库中的值,问题就解决了。感谢@user3249477 指出我朝这个方向思考。 顺便说一句,“UTF8 without BOM”似乎是 Eclipse 在创建 URF8 文件时使用的默认编码,所以要小心!
原因 2: 生成文件的编码不正确。
原因 1 的问题指出了在我面临的其他一些情况下应该考虑的问题。在我的一个应用程序中,我使用简单的 Java 应用程序将原始数据插入到后端数据库中。原来的问题是我正在通过中间格式,存储在文件系统上的文件?我用来验证我正确解释了原始数据。我注意到这些文件也是“不带 BOM 的 UTF8”创建的。我使用此代码写入这些文件:
BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(outputFilePath));
writer = new BufferedWriter(new OutputStreamWriter(outputStream, STRING_ENCODING));
writer.append(string);
我改成了:
BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(outputFilePath));
writer = new BufferedWriter(new OutputStreamWriter(outputStream, STRING_ENCODING));
// prepending a bom
writer.write('\ufeff');
writer.append(string);
遵循this answer 的处方。我添加的这一行基本上使所有中间文件都使用 BOM 以“UTF8”编码并解决了我的编码问题。
原因 3: HTTP 响应解析不正确
我在几个应用程序中遇到的最后一个问题是我没有正确解释 UTF8 http 响应。我曾经有以下代码:
HttpResponse response = httpClient.execute(host, request, (HttpContext) null);
String responseBody = null;
responseBody = IOHelper.getInputStreamContents(responseStream);
IOHelper 是我自己编写的实用程序,并将流内容读取到String。我用 Android API 中已经提供的方法替换了这段代码:
HttpResponse response = httpClient.execute(host, request, (HttpContext) null);
String responseBody = null;
if (response.getEntity() != null) {
responseBody = EntityUtils.toString(response.getEntity(), HTTP.UTF_8);
}
这解决了我在使用 HTTP 响应时遇到的编码问题。
作为结论,我可以说在 Android 中使用 UTF8 编码时需要特别注意 BOM / 没有 BOM 字符串。我很高兴在这次调查中学到了很多新东西。