代码之家  ›  专栏  ›  技术社区  ›  willcodejavaforfood

字符编码故障- Java

  •  0
  • willcodejavaforfood  · 技术社区  · 16 年前

    我已经编写了一个小应用程序,它可以进行一些文本操作,并将输出写入一个文件(HTML、CSV、Docx、XML),这一切在Mac OS X上似乎都可以正常工作。但是在Windows上,我似乎遇到了字符编码问题,很多'“'似乎消失了,取而代之的是一些奇怪的东西。通常是成对的结束符。

    我使用FreeMarker创建输出文件,在一种情况下,在读取模板和写入输出之间还有一个bytearrayStream。我认为这是一个字符编码问题,所以如果有人可以给我建议或指向我的一些“最佳实践”的资源处理字符编码在Java中。

    谢谢

    4 回复  |  直到 16 年前
        1
  •  5
  •   Michael Borgwardt    16 年前

    实际上只有一个最佳实践:请注意,字符串和字节是两个根本不同的东西,并且每当您在它们之间转换时,都会使用字符编码(隐式或显式),这是您需要注意的。

    Java API中典型的问题点是:

    • new String(byte[])
    • String.getBytes()
    • FileReader, FileWriter

    所有这些隐式使用平台默认编码,这取决于操作系统和用户的区域设置。通常,最好避免这种情况,并在上述情况下显式声明编码(不幸的是,filereader/writer不允许这样做,因此必须使用inputstreamreader/writer)。

    但是,您对引号的问题和模板引擎的使用可能有一个更简单的解释。你用什么程序来写模板?听起来像是插入 "smart quotes" 这是Windows特定CP1251编码的一部分,但不存在于更全局的ISO-8859-1编码中。

    您可能需要做的是注意保存模板的编码,并将模板引擎配置为在读取模板时使用该编码。还要注意,一些texxt文件,特别是xml,在头中显式声明编码,如果头与文件使用的实际编码不一致,您将永远遇到问题。

        2
  •  3
  •   user53267    16 年前

    您可以通过提供f,ex来控制运行JVM的编码方式。

    -dfile.encoding=utf-8

    对于(当然是UTF-8)作为JVM的参数。然后,您应该在所有平台上获得可预测的结果。例子:

    Java-dFr.Actudio= UTF-8My.

        3
  •  1
  •   Brian Agnew    16 年前

    通过名为 -Dfile.encoding 会解决很多问题。

    确保您的应用程序不使用 byte[] <-> String 不指定编码的转换很重要,因为有时您无法强制执行VM编码(例如,如果您有多个应用程序使用的应用服务器)

    如果你对整个编码问题感到困惑,或者想修改你的知识,JoelSpolsky写了一篇 great article 对此。

        4
  •  0
  •   ronald    14 年前

    我必须确保OutputStreamWriter使用正确的编码

    OutputStream out = ...
    OutputStreamWriter writer = new OutputStreamWriter(out, "UTF-8");
    template.process(model, writer);
    

    另外,如果使用bytearrayOutputstream,请确保使用正确的编码调用ToString:

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ...
    baos.toString("UTF-8");