java控制台输出的默认字符编码

2023-12-22

Java如何确定使用的编码System.out?

给定以下课程:

import java.io.File;
import java.io.PrintWriter;

public class Foo
{
    public static void main(String[] args) throws Exception
    {
        String s = "xxäñxx";
        System.out.println(s);
        PrintWriter out = new PrintWriter(new File("test.txt"), "UTF-8");
        out.println(s);
        out.close();
    }
}

它保存为 UTF-8 并编译为javac -encoding UTF-8 Foo.java在 Windows 系统上。

然后在 git-bash 控制台(使用 UTF-8 字符集)上我执行以下操作:

$ java Foo
xxõ±xx
$ java -Dfile.encoding=UTF-8 Foo
xxäñxx
$ cat test.txt
xxäñxx
$ java Foo | cat
xxäñxx
$ java -Dfile.encoding=UTF-8 Foo | cat
xxäñxx

这里发生了什么?

显然,java 检查它是否连接到终端,并在这种情况下更改其编码。有没有办法强制Java简单地输出纯UTF-8?


我也用cmd控制台尝试了同样的操作。重定向 STDOUT 似乎没有任何区别。如果没有 file.encoding 参数,它会输出 ansi 编码,如果有参数,它会输出 utf8 编码。


我假设您的控制台仍在 cmd.exe 下运行。我怀疑你的控制台是否真的需要 UTF-8 - 我希望它确实是 OEM DOS 编码(例如850 或 437 http://msdn.microsoft.com/en-us/library/dd317756(VS.85).aspx.)

Java 将使用以下方式对字节进行编码默认编码 http://docs.oracle.com/javase/8/docs/api/java/nio/charset/Charset.html#defaultCharset--在 JVM 初始化期间设置。

在我的电脑上重现:

java Foo

Java编码为windows-1252;控制台解码为 IBM850。结果:Mojibake

java -Dfile.encoding=UTF-8 Foo

Java编码为UTF-8;控制台解码为 IBM850。结果:Mojibake

cat test.txt

cat 将文件解码为 UTF-8; cat 编码为 IBM850;控制台解码为 IBM850。

java Foo | cat

Java编码为windows-1252; cat 解码为 windows-1252; cat 编码为 IBM850;控制台解码为 IBM850

java -Dfile.encoding=UTF-8 Foo | cat

Java编码为UTF-8; cat 解码为 UTF-8; cat 编码为 IBM850;控制台解码为 IBM850

此次实施cat必须使用启发式方法确定字符数据是否为 ​​UTF-8,然后将数据从 UTF-8 或 ANSI(例如 windows-1252)转码为控制台编码(例如 IBM850)。

可以使用以下命令确认这一点:

$ java HexDump utf8.txt
78 78 c3 a4 c3 b1 78 78

$ cat utf8.txt
xxäñxx

$ java HexDump ansi.txt
78 78 e4 f1 78 78

$ cat ansi.txt
xxäñxx

The cat命令可以做出这个决定,因为e4 f1不是有效的 UTF-8 序列。

您可以通过以下方式更正 Java 输出:

  • 设置控制台编码 http://illegalargumentexception.blogspot.co.uk/2009/04/i18n-unicode-at-windows-command-prompt.html#charsets_1252到系统 ANSI 值
  • 使用Console http://docs.oracle.com/javase/8/docs/api/java/io/Console.html type
  • 使用一些湿婆层 http://illegalargumentexception.blogspot.co.uk/2013/06/go-unicode-on-windows-command-prompt.html#gou_java就像你正在做的那样cat

HexDump是一个简单的 Java 应用程序:

import java.io.*;
class HexDump {
  public static void main(String[] args) throws IOException {
    try (InputStream in = new FileInputStream(args[0])) {
      int r;
      while((r = in.read()) != -1) {
        System.out.format("%02x ", 0xFF & r);
      }
      System.out.println();
    }
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java控制台输出的默认字符编码 的相关文章

随机推荐

  • 将 Javascript 函数作为参数传递给 C++ 函数

    我用 C 声明我的对象 class Action public QObject Q OBJECT Q PROPERTY QString name READ name public Action QObject 0 QString name
  • Libc共享库如何加载到内存中并在进程之间共享?

    我想了解Libc共享库如何加载到内存中并在进程之间共享 是否有一个 libc 实例加载到内存中并在所有进程之间共享 或者是每个进程的内存中的每个 libc 实例 我不清楚 libc 如何在进程之间共享 谢谢 阿迪亚 libc 的一个实例在所
  • 假镜子。你能帮我解决吗?

    这里是 BFG 9000 每次射击都会摧毁三个相邻的阳台 第 N 个阳台毗邻 第一个 射击后 生存怪物对列昂尼德造成伤害 小说的主要英雄 每个怪物一个单位 进一步后续新拍摄等 直到所有怪物 将会灭亡 需要定义最小损坏量 这可以带走列昂尼德
  • 在 Unity App.Config 文件中包含通用类

    我有一类类型ISimpleCache
  • 从已部署的 Azure 应用服务中提取 MachineKey

    我有一个 ASP NET 4 6 Web API 服务作为 Azure 应用服务在单个区域的单个应用服务计划中运行 我们正在修改此服务 使其部署在多个区域 并在前面有一个负载均衡器 每个区域都有自己的应用服务计划 因此 我们需要确保在每个应
  • API 或代码:Hibernate 3 和 4 之间的区别?

    我已经粘贴了休眠3配置文件 SessionFactory 类来配置此 config xml 和带有 JPA 注释的 bean 我想知道我是否在使用休眠4那么代码级别的上下文会发生什么变化 或者外行语言的非常广泛的差异或进步 休眠配置文件
  • Matlab:将全局坐标转换为图形坐标

    如果我通过获取坐标 coords get 0 PointerLocation 我怎样才能将它们转换为通过获得的积分ginput 即我想从中获得相同的值 coords get 0 PointerLocation coords someConv
  • 使用 declarative_base 派生对象的 alembic create_table

    我有一个 Alchemy ORM 对象 from sqlalchemy ext declarative import declarative base Base declarative base class MyORM Base id Co
  • Morningstar 用 python 请求获取 10 年的财务数据

    看来晨星登录解决方案在不使用selenium等无头浏览器 如何登录morningstar com https stackoverflow com questions 48228739 how can i log in to mornings
  • R 中依赖非标准评估的函数的包装器

    我写了一个包装ftable因为我需要计算许多变量的频率和百分比的平面表 mytable lt function tab lt ftable exclude NULL prop lt prop table x tab margin 2 100
  • 为什么composite-id类必须实现Serialized?

    如果我创建一个复合 id 类 它不实现 Serialized 如下所示 Entity Table name board public class Board Id Column name keyword news id private in
  • 在 Protractor 测试中访问 Angular

    是否可以像在单元测试中一样在量角器测试中访问角度 用例是我有一个转换文本的服务 我想访问该服务以转换实际测试脚本中的一些数据 我知道有addMockModule量角器中的方法 但我不知道如何将它用于此目的 将不胜感激任何帮助 有一个函数叫做
  • 用遗传算法建立排名,

    BIG 版本后的问题 我需要使用遗传算法建立排名 我有这样的数据 P a gt b 0 9 P b gt c 0 7 P c gt d 0 8 P b gt d 0 3 现在 让我们解释一下a b c d作为足球队的名称 以及P x gt
  • 如何在 jupyter/ipython 笔记本中显示图形旁边的文本段落

    我正在寻找一种 也许是创造性的 方法将文本放置在 jupyter 笔记本中的图表旁边 这个想法是在图表旁边有一个详细的描述 而不是笔记本通常的垂直流程 有任何想法吗 一种相当有创意的方法是模仿内联后端但添加基础表 python 2 7 的可
  • 预处理器宏有什么用?

    在阅读了另一个有关宏使用的问题后 我想知道 什么are他们有什么好处 我认为不会很快被任何其他语言结构取代的一件事是减少您需要输入以下内容的相关单词的数量 void log type const bool value std cout lt
  • PermGen 空间异常

    我正在使用 JAVA 5 32 位 来运行在 JBoss 上的应用程序 但它仅适用于 32 位 当我们将其部署在 64 位 java5 上时 它会抛出异常 java lang OutOfMemoryError PermGen space e
  • XmlPullParser 获取子节点的首选方式?

    获取 XML 字符串的子节点的首选方法是什么 android中似乎缺乏使用XmlPullParser进行解析的好例子 例如 如果我想解析这个
  • 监视文件夹并查找文件是否在 Windows 应用程序中打开

    Edit 所以显然有没有简单或方便的方法来了解文件是否已打开 是否由进程保存 我认为这是 Windows 操作系统本身的问题或设计决策 因为即使像 Process Explorer 这样的程序也无法判断我何时在窗口旁边的记事本中打开了 my
  • 如何获取给定维基数据 ID 的语句列表?

    我唯一能做的就是这个链接 https www wikidata org w api php action wbgetentities ids Q568 format jsonfm 但这会产生大量无用的数据 我需要的是获取给定项目的所有语句
  • java控制台输出的默认字符编码

    Java如何确定使用的编码System out 给定以下课程 import java io File import java io PrintWriter public class Foo public static void main S