问题在于:我的代码中有一些中文,我将其写入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()
时添加字符集,以避免在不同环境中运行程序时中文或日文输出不可读。
答案 0 :(得分: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();
答案 1 :(得分:0)
如果在命令行中指定了系统属性,则在程序加载后它们就可用。
如果你在程序中指定它们,那么它们只有在你设置之后才可用,通过用main方法加载类,你甚至可以在设置它们之前使用系统属性加载其他类!
答案 2 :(得分:0)
并非所有属性都可以在运行时更改。这意味着如果不指定value作为参数并决定从System.setProperty设置它,那将无效。 “file.encoding”就是其中之一。 Possible duplicate.