【问题标题】:Java linux character encoding issueJava linux字符编码问题
【发布时间】:2011-05-13 09:03:15
【问题描述】:

我在 linux 中遇到了字符编码问题。我正在从亚马逊 S3 检索内容,该内容是使用 UTF-8 编码保存的。内容是中文的,我可以在浏览器中正确看到内容。

我正在使用 amazon SDK 检索内容并对其进行一些更新。这是我正在使用的代码:


StringBuilder builder = new StringBuilder();
S3Object object = client.getObject(new GetObjectRequest(bucketName, key));
        BufferedReader reader = new BufferedReader(new 
                InputStreamReader(object.getObjectContent(), "utf-8"));
while (true) {
    String line = reader.readLine();
    if (line == null) 
        break;
    builder.append(line);
}

这段代码在 Windows 环境下运行良好,因为我能够更新内容并将其保存回来,而不会弄乱其中的任何汉字。

但是,它在 linux 环境中的作用不同。代码无法正确翻译字符,中文字符被渲染为???

我不确定这里出了什么问题。任何指针将不胜感激。

-谢谢

【问题讨论】:

  • 当你说字符被渲染为???时,你在哪里看到这些渲染?也许数据没问题,但您正试图在不支持 Unicode 的环境或没有正确字形的字体中显示它们。
  • 该代码看起来不错。可能是您的终端需要处于 UTF-8 模式才能显示字符,或者您输出的编码错误,可能使用了可能不是 UTF-8 的平台默认编码。向我们展示您用于输出字符的代码,并告诉我们您使用的是什么终端。
  • 当您说字符没有正确显示时,您是在将它们输出到控制台吗?如果有,是什么类型的控制台?
  • 它与显示器无关。我将一些文本添加回内容,然后将其保存回 S3。如果我在 Windows 中执行此过程并在 S3 中查找更新的数据,汉字看起来很好。但如果它在 Linux 中得到处理,那么字符就会变成 ??? .我正在使用 S3 链接在浏览器中查看它。
  • 也许,我应该准确一点。检索内容后,我将在内容中添加更多汉字并将其保存回 S3。我添加的新角色看起来不错。现有的角色变得一团糟。我对这种奇怪的行为一无所知。

标签: java linux encoding character-encoding


【解决方案1】:

您使用的 2 个操作系统的默认字符集不同。

首先,您可以通过打印出默认字符集来确认差异。

Charset.defaultCharset.name()

在您的代码中的某处,我认为此默认字符集正在用于某些字符串转换。正确的程序应该是追踪它,并指定 UTF-8。

在没有看到该代码的情况下,我只能建议“作弊”的方法:在代码开头附近或在 Java 启动时显式设置默认字符集。请参阅此处更改默认字符集:Setting the default Java character encoding?

HTH

【讨论】:

  • 。感谢您的输入。 Charset.defaultCharset.name() --> 显示 US_ASCII。现在,如果我更新 .bashrc 并添加 LANG=en_US.UTF-8,它工作正常。但我想以编程方式执行此操作,而不是在 bash 配置文件中设置它。不确定,为什么编码为 UTF-8 不能解决问题。我什至尝试将字符串编码为 utf-8。有没有办法覆盖java中的默认字符集?
  • 嗨 Shamik,您说您找到了解决此问题的方法。目前我正面临着完全相同的情况。你能解释一下你是怎么解决的吗?
猜你喜欢
  • 1970-01-01
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 2013-08-22
  • 2015-03-02
  • 2011-03-24
  • 1970-01-01
相关资源
最近更新 更多