2016-04-27 125 views
0

我想从Windows的属性文件中显示字符(中文或其他语言)。java将字符串转换为UTF

假设我从服务器启动时设置的System属性读取属性server.location =上海的位置。

我试图做到这一点

new String(locationStr.getBytes(System.getProperty("file.encoding")), "UTF-8"); 

这适用于Linux的,但不能让它在Windows上运行。

以下是总结snipet,没有的系统属性是如何设置的

URL fileURL = new URL("file:filePathAndName"); 
InputStream iStream = fileURL.openStream() ; 
Properties prop = new Properties(); 
prop.load(iStream); 
//Enumerate over prop and set System.setProperty (key, value); 

阅读财产System.getProperty

这是所有属性文件集中完成(“server.location”)语法,因此在读取或设置特定编码时修改任何内容都可能影响其他内容,因此不可取。

还尝试编码使用URLEncoder.encode但没有帮助。 我没有看到任何特定的编码集。 Java使用UTF-16,在Windows上,编码是'Cp1252'。我在这里错过了什么?

任何帮助,使这项工作或抛出一些光,表示赞赏。也试图通过现有的问题,但答案并不直接适用于创建新问题。 谢谢

编辑: 无法将获得的字符串转换为UTF-8。不知怎的,相信人们阅读方式乔普提到的性质和检索字符串正确

+1

属性文件应该在ISO_8859_1中进行编码。你的文件实际上包含什么? –

+0

属性文件中的“UTF-8”听起来令人困惑? – Priyamal

+0

嗨JB,不知道你的意思是“文件应该在ISO-8859-1编码”我在Windows中发现默认编码是Cp1252。属性文件由多个属性组成,每行一个。例如server.name = someName server.type = someType server.location = someLocation etc – Nilesh

回答

1

String/char/Reader/Writer在java中包含Unicode文本。二进制数据byte[], InputStream/OutputStream必须与编码关联才能转换为文本字符串。

看来你的属性文件是UTF-8。然后在加载属性时指定一个固定的编码。

InputStream iStream = fileURL.openStream(); 
Reader reader = new BufferedReader(new InputStreamReader(iStream, StandardCharsets.UTF_8)); 
Properties prop = new Properties(); 
prop.load(reader); 

这里使用InputStreamReader通过转换指定的InputStream的编码桥接从二进制数据到(Unicode)的文本的转换。

+0

感谢Joop的答案,但想知道什么可能是不能将字符串转换为Unicode的原因。如前所述,修改代码以读取和设置系统属性几乎遥不可及。因此,想要从系统属性解释字符串帖子阅读。 – Nilesh

+0

所以问题在于系统属性的传递。你在使用'java -Dserver.location = ... ...'吗?然后,您仅限于命令行的操作系统编码。 Java可能会收到错误的字符串内容,然后甚至可能无法更正。 –

+0

只是为了添加一些信息,该属性在一个文件中提到,其中提到了许多关键值对,每行一个。例如。 server.name = somename server.type = stype server.location = someLocation ...并通过不同的进程读取,在一个这样的进程中,我打算利用字符串 – Nilesh

0
Properties prop = new Properties(); 
InputStream input = null; 
String filename = "config.properties"; 
input = ClassName.class.getClassLoader().getResourceAsStream(filename); 

      //loading properties 
      prop.load(input); 

      //getting the properties 
       System.out.println(prop.getProperty("propertyname1")); 
       System.out.println(prop.getProperty("propertyName2")); 
       System.out.println(prop.getProperty("propertyName3")); 

,或者您可以枚举在proerties

Enumeration e = prop.propertyNames(); 

    while (e.hasMoreElements()) { 
     String key = (String) e.nextElement(); 
     System.out.println(key + " -- " + prop.getProperty(key)); 
    } 

这是怎么了,你应该真正从属性文件中获取属性 和你不必担心utf-8字符。

+0

感谢Priyamal的答案。如果我可以修改阅读代码,这将是有用的。但有没有办法将字符串从系统属性转换为正确的UTF-8 – Nilesh