【问题标题】:What is the difference between setting system property from command line and code?从命令行和代码设置系统属性有什么区别?
【发布时间】:2013-10-14 14:21:26
【问题描述】:

问题来了:我的代码中有一些中文,我正在将其写入sqlite。

当我在 Eclipse 中运行我的程序并从 sqlite 中读取字符串时,它工作正常。但是当我将项目打包到一个 jar 并在命令行中运行它时。从sqlite中读出的中文字符串不可读。

经过一些试验,我知道问题出在file.encoding 系统属性上。当我使用命令:java -Dfile.encoding=UTF-8 -jar TK.jar 运行 jar 时,它适用于中文单词,但如果我在代码中设置系统属性:System.setProperty("file.encoding", "UTF-8");,它将不起作用。

那么,从命令行和代码设置系统属性有什么区别?谁能告诉我如何在代码中设置file.encoding 系统属性?

非常感谢!

总结:

在使用String.getBytes()new String()时记得添加字符集,以避免在不同环境下运行程序时出现中文或日文的不可读输出。

【问题讨论】:

  • DB驱动初始化前是否设置了属性?可能是 DB 驱动程序正在使用默认系统值进行初始化,而您在此之后设置属性?
  • 不需要设置file.encoding(不在命令行,也不在代码中)。在您的代码中的某处,您可能依赖于将默认字符集设置为UTF-8(例如,您可能在未指定字符集的情况下调用String.getBytes(),或者在未指定字符集的情况下从文本文件中读取)。在您的代码中修复该问题。
  • 是的,我在我的 Main 方法的第一行设置了属性,并调用 System.getProperty 方法以确保它已经更改为“UTF-8”@Vikdor
  • 你打赌,我没有将字符集添加到String.getBytes(),非常感谢! (你能在下面给出你的答案吗?)@Jesper

标签: java sqlite encoding jvm


【解决方案1】:

在您的代码中,您可能依赖于默认字符集UTF-8。例如,当您调用String.getBytes() 而不指定字符集时,Java 将使用默认字符集。如果你总是想要UTF-8,那么在调用String.getBytes()时指定这个:

byte[] utf8bytes = text.getBytes("UTF-8");

另外,如果要读取具有特定字符编码的文件,请指定字符编码,而不是依赖默认设置。例如:

InputStream is = new FileInputStream("utf8file.txt");
BufferedReader in = new BufferedReader(new InputStreamReader(is, "UTF-8"));

// Read text, file will be read as UTF-8
String line = in.readLine();

in.close();

【讨论】:

    【解决方案2】:

    如果您在命令行上指定系统属性,它们会在程序加载后立即可用。

    如果您在程序中指定它们,那么它们只有在您设置它们后才可用,通过使用您的 main 方法加载类,您甚至可能在您能够设置它们之前就已经使用系统属性加载了其他类!

    【讨论】:

    • 看了你的帖子后我还不清楚。我在Main方法的第一行调用System.setProperty("file.encoding", "UTF-8"),这与在命令行中设置它的方式如java -Dfile.encoding=UTF-8 -jar TK.jar有什么不同?
    【解决方案3】:

    并非所有属性都可以在运行时更改。这意味着如果不将值指定为参数并决定从 System.setProperty 设置它,那将无效。 “file.encoding”就是其中之一。 Possible duplicate.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-21
      • 2011-11-13
      • 2015-09-21
      • 2015-07-03
      • 2011-04-13
      • 2013-11-30
      • 2020-08-14
      • 2022-11-04
      相关资源
      最近更新 更多