2016-04-27 141 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