【问题标题】:UTF8 characters showing weirdly or random basis in Android TextView在 Android TextView 中显示奇怪或随机的 UTF8 字符
【发布时间】:2014-10-17 04:55:25
【问题描述】:

至少有 5 个应用程序尝试显示 UTF8 编码的字符,而且每次都很少看到随机字符被菱形问号替换(有关详细信息,请参见图片)。

我附上一个页面布局来展示我的问题。布局非常基本,我正在创建非常简单的民意调查。 “Съгласен съм”文本取自数据库,它刚刚被脚本插入,使用复制粘贴常量。文字显示在TextViews。

有人遇到过这样的问题吗?请指教!

编辑:我忘了提到的是,奇怪字符的数量和位置因不同的 Android 手机型号而异。

【问题讨论】:

  • 这是什么 DBMS? SQLite?
  • @user3249477 标准 Android SQLite 它是本地设备数据库。
  • 您是否手动检查过数据库,字符串是否保存正确?
  • @user3249477 当我在编辑器中打开时,它看起来像,但是否有一些编辑器处理一些奇怪的情况。此外,当我观察到奇怪的钻石数据库受到干扰时,并非总是如此。

标签: java android utf-8 textview


【解决方案1】:

最后,我在所有应用程序中都解决了问题。实际上,这些问题归结为 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 字符串。我很高兴在这次调查中学到了很多新东西。

【讨论】:

    猜你喜欢
    • 2014-02-12
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    • 2023-03-11
    • 2011-05-13
    • 2011-04-07
    • 1970-01-01
    相关资源
    最近更新 更多