3

这就是问题所在:我的代码中有一些中文,我正在将其写入 sqlite。

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

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

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

非常感谢!

总结一下:

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

4

3 回答 3

4

在您的代码中的某处,您可能依赖于默认字符集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();
于 2013-10-16T07:26:56.560 回答
0

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

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

于 2013-10-14T14:25:58.463 回答
0

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

于 2013-10-15T11:09:14.400 回答