首页 文章

设置默认的Java字符编码?

提问于
浏览
317

如何以编程方式正确设置JVM(1.5.x)使用的默认字符编码?

我已经读过 -Dfile.encoding=whatever 曾经是旧JVM的方法......我没有那么奢侈,因为我不会进入 .

我试过了:

System.setProperty("file.encoding", "UTF-8");

并且属性已设置,但它似乎不会导致下面的最终getBytes调用使用UTF8:

System.setProperty("file.encoding", "UTF-8");

    byte inbytes[] = new byte[1024];

    FileInputStream fis = new FileInputStream("response.txt");
    fis.read(inbytes);
    FileOutputStream fos = new FileOutputStream("response-2.txt");
    String in = new String(inbytes, "UTF8");
    fos.write(in.getBytes());

15 回答

  • 0

    我已经尝试了很多东西,但这里的示例代码非常完美 . Link

    代码的关键是:

    String s = "एक गाव में एक किसान";
    String out = new String(s.getBytes("UTF-8"), "ISO-8859-1");
    
  • 1

    我无法回答您的原始问题,但我想为您提供一些建议 - 不要依赖于JVM的默认编码 . 最好在代码中明确指定所需的编码(即“UTF-8”) . 这样,您就知道它甚至可以跨不同的系统和JVM配置工作 .

  • 3

    我有一种绝对有效的hacky方式!

    System.setProperty("file.encoding","UTF-8");
    Field charset = Charset.class.getDeclaredField("defaultCharset");
    charset.setAccessible(true);
    charset.set(null,null);
    

    这样你就会欺骗JVM,它会认为charset没有设置,并让它在运行时再次设置为UTF-8!

  • 268

    我们将两个系统属性放在一起,它使系统将所有内容都放入utf8中

    file.encoding=UTF8
    client.encoding.override=UTF-8
    
  • 12

    不幸的是,必须在JVM启动时指定 file.encoding 属性;在输入main方法时, String.getBytes() 使用的字符编码以及 InputStreamReaderOutputStreamWriter 的默认构造函数已被永久缓存 .

    在这样的特殊情况下Edward Grech points out,,环境变量 JAVA_TOOL_OPTIONS 可用于指定此属性,但通常如下所示:

    java -Dfile.encoding=UTF-8 … com.x.Main
    

    Charset.defaultCharset() 将反映对 file.encoding 属性的更改,但核心Java库中需要确定默认字符编码的大多数代码都不使用此机制 .

    在编码或解码时,可以查询 file.encoding 属性或 Charset.defaultCharset() 以查找当前的默认编码,并使用适当的方法或构造函数重载来指定它 .

  • 1

    我们遇到了同样的问题 . 我们有条不紊地尝试了本文(和其他人)的一些建议但无济于事 . 我们还尝试添加-Dfile.encoding = UTF8,似乎没有任何工作 .

    对于遇到此问题的人,以下文章最终帮助我们跟踪描述了语言环境设置如何破坏Java / Tomcat中的unicode / UTF-8

    http://www.jvmhost.com/articles/locale-breaks-unicode-utf-8-java-tomcat

    在〜/ .bashrc文件中正确设置语言环境对我们有用 .

  • 17

    试试这个 :

    new OutputStreamWriter( new FileOutputStream("Your_file_fullpath" ),Charset.forName("UTF8"))
    
  • 0
    mvn clean install -Dfile.encoding=UTF-8 -Dmaven.repo.local=/path-to-m2
    

    命令与exec-maven-plugin一起使用以在配置jenkins任务时解决以下错误 .

    Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=512m; support was removed in 8.0
    Error occurred during initialization of VM
    java.nio.charset.IllegalCharsetNameException: "UTF-8"
        at java.nio.charset.Charset.checkName(Charset.java:315)
        at java.nio.charset.Charset.lookup2(Charset.java:484)
        at java.nio.charset.Charset.lookup(Charset.java:464)
        at java.nio.charset.Charset.defaultCharset(Charset.java:609)
        at sun.nio.cs.StreamEncoder.forOutputStreamWriter(StreamEncoder.java:56)
        at java.io.OutputStreamWriter.<init>(OutputStreamWriter.java:111)
        at java.io.PrintStream.<init>(PrintStream.java:104)
        at java.io.PrintStream.<init>(PrintStream.java:151)
        at java.lang.System.newPrintStream(System.java:1148)
        at java.lang.System.initializeSystemClass(System.java:1192)
    
  • 0

    我认为比设置平台的默认字符集更好的方法,特别是因为你似乎对影响应用程序部署有限制,更不用说平台了,就是调用更安全的 String.getBytes("charsetName") . 这样你的应用程序就不依赖于它无法控制的东西 .

    我个人认为 String.getBytes() 应该被弃用,因为它在我见过的许多情况下都会造成严重问题,开发人员没有考虑可能更改的默认字符集 .

  • 5

    我正在使用Amazon(AWS)Elastic Beanstalk并成功将其更改为UTF-8 .

    在Elastic Beanstalk中,转到Configuration> Software,“Environment properties” . 使用(值)-Dfile.encoding = UTF8添加(名称)JAVA_TOOL_OPTIONS

    保存后,环境将使用UTF-8编码重新启动 .

  • 36

    目前尚不清楚你做了什么,也没有控制权 . 如果可以在目标文件上插入不同的OutputStream类,则可以使用OutputStream的子类型,它将字符串转换为您定义的字符集下的字节,默认情况下为UTF-8 . 如果修改后的UTF-8足以满足您的需求,您可以使用 DataOutputStream.writeUTF(String)

    byte inbytes[] = new byte[1024];
    FileInputStream fis = new FileInputStream("response.txt");
    fis.read(inbytes);
    String in = new String(inbytes, "UTF8");
    DataOutputStream out = new DataOutputStream(new FileOutputStream("response-2.txt"));
    out.writeUTF(in); // no getBytes() here
    

    如果这种方法不可行,那么如果你在数据流和执行环境方面准确地说明你能够和不能控制的内容可能会有所帮助(虽然我知道有时说起来比说明的更容易) . 祝好运 .

  • 3

    如果您使用的是Spring Boot并希望在JVM中传递参数 file.encoding ,则必须按以下方式运行:

    mvn spring-boot:run -Drun.jvmArguments="-Dfile.encoding=UTF-8"
    

    这是我们需要的,因为我们使用 JTwig 模板,操作系统有 ANSI_X3.4-1968 ,我们通过 System.out.println(System.getProperty("file.encoding")); 找到了

    希望这有助于某人!

  • 56

    根据@Caspar对已接受答案的评论,根据Sun解决此问题的首选方法是:

    “在启动Java程序之前更改底层平台的语言环境 . ”

    http://bugs.java.com/view_bug.do?bug_id=4163515

    对于docker,请参阅:

    http://jaredmarkell.com/docker-and-locales/

  • 0

    最近我遇到了一家本地公司的Notes 6.5系统,发现webmail会在非中文本地安装的Windows上显示无法识别的字符 . 已经在网上挖了好几个星期,几分钟前发现它:

    在Java属性中,将以下字符串添加到运行时参数

    -Dfile.encoding=MS950 -Duser.language=zh -Duser.country=TW -Dsun.jnu.encoding=MS950
    

    在这种情况下,UTF-8设置不起作用 .

  • 154

    来自JVM™ Tool Interface文件......

    由于无法始终访问或修改命令行,例如在嵌入式VM中或仅在脚本内深入启动的VM中,因此提供了JAVA_TOOL_OPTIONS变量,以便在这些情况下可以启动代理 .

    通过将(Windows)环境变量 JAVA_TOOL_OPTIONS 设置为 -Dfile.encoding=UTF8 ,每次启动JVM时都会自动设置(Java) System 属性 . 您将知道该参数已被选中,因为以下消息将发布到 System.err

    选择JAVA_TOOL_OPTIONS:-Dfile.encoding = UTF8

相关问题