【问题标题】:How to make the PrintWriter to write UTF-8?如何让 PrintWriter 写入 UTF-8?
【发布时间】:2014-02-01 11:58:00
【问题描述】:

如何让PrintWriter写成UTF-8?

pstream = new PrintWriter(csocket.getOutputStream(), true);
String res = "some string";
pstream.println(res); // here I want to output string as UTF-8

【问题讨论】:

    标签: java utf-8 printwriter


    【解决方案1】:

    使用OutputStreamWriter

    pstream = new PrintWriter(new OutputStreamWriter(
        csocket.getOutputStream(), StandardCharsets.UTF_8), true)
    

    【讨论】:

    • 注意:OutputStreamWriter 文档建议在 BufferedWriter 中使用包装以提高效率
    【解决方案2】:
    OutputStream os = new FileOutputStream("file.txt");
    PrintWriter pw = new PrintWriter(new OutputStreamWriter(os, "UTF-8"));
    

    【讨论】:

      【解决方案3】:

      Java: Difference between PrintStream and PrintWriter讨论。

      为了快速:您可以使用讨论中建议的 -Dfile.encoding=utf8 JVM 参数或方法(请参阅第二个答案)。

      【讨论】:

      • JVM file.encoding 使我摆脱了多年来一直存在的问题。谢谢@Daniil!
      【解决方案4】:
      PrintWriter out1 = null;
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
          out1 = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(), StandardCharsets.UTF_8),true);
      } else { 
          out1 = new PrintWriter(new OutputStreamWriter(socket.getOutputStream(), "UTF8"), true);
      }
      

      【讨论】:

      • 问题与android无关。
      【解决方案5】:

      不要使用 PrintWriter。如果需要 UTF-8 编码,直接写入 OutputStream 即可。

      csocket.getOutputStream().write(res.getBytes("UTF-8"));
      

      【讨论】:

      • 虽然这是可能的,但这并不能提供一个Writer OP 可能正在寻找的东西。
      • 有些情况java.io.PrintWriter是无法避免的,比如子类化javax.servlet.http.HttpServletResponseWrapper时。
      • 我同意直接写入 OutputStream ,这样您就可以确切地知道发生了什么。在伟大的类层次结构中使用包装器通常需要永远让它们工作 - 简单更好。
      【解决方案6】:

      您只能使用任何字符集写入文件,否则使用的平台默认字符集请参阅doc

      【讨论】:

        猜你喜欢
        • 2016-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-07
        • 2018-08-26
        • 1970-01-01
        • 1970-01-01
        • 2011-05-06
        相关资源
        最近更新 更多