2013-10-14 44 views
3

问题出在这里:我的代码中有一些中文,我正在写入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()时添加字符集。

+1

是否在DB驱动程序初始化之前设置属性?数据库驱动程序可能会使用默认的系统值进行初始化,并且您在设置属性之后? – Vikdor

+2

不需要设置'file.encoding'(不在命令行或代码中)。在代码中的某处,您可能依赖于默认字符集被设置为“UTF-8”(例如,您可能正在调用'String.getBytes()'而不指定字符集,或者从文本文件中读取而未指定字符集)。修复代码中的问题。 – Jesper

+0

是的,我在我的主要方法的第一行设置属性,我调用'System.getProperty'方法来确保它已经更改为“UTF-8”@Vikdor – Judking

回答

4

在您的代码的某处,您可能依赖的默认字符集是UTF-8。例如,当您在不指定字符集的情况下调用String.getBytes()时,Java将使用默认字符集。如果你想阅读与特定的字符编码文件,然后指定字符编码,而不是依赖于默认设置也

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

,如果你总是希望UTF-8,然后调用String.getBytes()时注明。例如:

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(); 
0

如果您在命令行中指定了系统属性,则只要程序加载就可以使用它们。

如果你在你的程序中指定它们,那么它们只有在你设置它们之后才可用,通过用你的主方法加载你的类,你甚至可以在你设置它们之前已经使用系统属性加载其他类。

+0

看完你的帖子后我不明白。我在Main方法的第一行调用了'System.setProperty(“file.encoding”,“UTF-8”)'',它怎么会和'java -Dfile.encoding = UTF-8 -jar TK.jar'? – Judking

0

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

相关问题