2013-03-03 261 views
0

我有一個屬性文件,它可以/不可以包含Unicode逃過它的按鍵值的字符。請參閱下面的示例。我的工作是確保如果屬性文件中的值包含非ascii字符,那麼它應該被unicode轉義。因此,在下面的示例中,第一個條目是OK,所有條目(如第二個條目)應該被刪除並轉換爲第一個條目。在Java中,如何檢測一個字符串是unicode逃脫

##sample.properties
escaped=cari\u00F1o
nonescaped=cariño
normal=darling

從本質上講,我的問題是Java 卡里\ u00F1o卡里諾之間,因爲就如Java而言它會將它們視爲相同哪能區分。

+1

http://stackoverflow.com/questions/1673544/how-do-i-detect-unicode-characters-in-a-java-string應該有所幫助。 – 2013-03-03 11:53:09

+1

[This answer](http://stackoverflow.com/a/774153/828193)也可能有所幫助。 – user000001 2013-03-03 11:53:41

回答

2

Java中的屬性文件必須保存在ISO-8859-1字符集中供Java讀取。這意味着可以使用西歐語言中的特殊字符而不會轉義它們。不能使用來自復活節歐洲,俄羅斯或中國等其他語言的字符而不能逃脫它們。

因此,只有幾個非ASCII字符可以出現在屬性文件中而不會被轉義。

檢測是否字符已經越獄與否,你需要打開屬性文件直接,而不是通過屬性類。當你通過它加載一個文件時,Properties類會爲你做所有的轉義。您應該使用File類或System.getResourceAsStream作爲InputStream打開它們。一旦你這樣做,你可以一次掃描一個字節的輸入流,並確保所有字節都在0x20-0x7E範圍內,再加上新行\ r和\ n,這是你在屬性文件中期望的ASCII range of characters

我建議你的譯員不要直接寫屬性文件。他們應該爲您提供像轉換成屬性文件的電子表格這樣的文檔。或者他們可以使用translation editor such as Attesoro(我寫的)讓他們保存正確轉義的屬性文件。

1

你可以簡單地使用native2ascii工具,它準確地執行這種轉換(將轉換所有非ASCII字符來逃脫,但留下現有逃逸完好)。

+0

感謝它真的幫助! – 2013-03-03 13:13:20

0

你的問題是,在Java Properties解碼屬性文件,假設ISO-8859-1編碼,並解析轉義Unicode字符。

所以從Properties的角度來看,這兩個字符串確實是一樣的。

我相信如果你需要區分這兩個,你會需要來編寫你自己的解析器

這實際上是一個你不需要在意的默認設置。唯一讓我感到奇怪的是,(唯一)編碼是ISO-8859-1,可能是出於歷史原因。