2014-06-26 45 views
0

我一直在使用正規化轉換unicode字符串以ASCII在Java這在UNIX/Linux下正常

String s = "口水雞 hello Ä"; 

String s1 = Normalizer.normalize(s, Normalizer.Form.NFKD); 
String regex = Pattern.quote("[\\p{InCombiningDiacriticalMarks}\\p{IsLm}\\p{IsSk}]+"); 

String s2 = new String(s1.replaceAll(regex, "").getBytes("ascii"), "ascii"); 

System.out.println(s2); 
System.out.println(s.length() == s2.length()); 

已經嘗試過,我想它在的Unix/Linux工作,

+0

你的意思是說,正則表達式是UTF-8 – anshulkatta

+0

我得到這個從http://stackoverflow.com/questions/15356716/how-can-我轉換unicode字符串到ascii在java中 – anshulkatta

回答

0

說明

首先在java文本(String/Reader/Writer)中已經是Unicode。對於java源代碼(字符串文字),編輯器和javac編譯器應該使用相同的編碼。理想的UTF-8。

規範化器拆分爲基本字母並結合變音標記和正則表達式刪除這些標記。將帶有ä é fi fl ĉ œ等口音的文本轉換爲a e fi fl c oe爲ASCII。

因此,你會得到 - 我認爲 - "??? hello A"

Charset ascii = StandardCharsets.US_ASCII; 
String s2 = new String(s1.replaceAll(regex, "").getBytes(ascii), ascii); 

爲了防止接收問號(原始字符串?之間有區別),你可以使用一個Charset.newDecoder()

對於ASCII,你仍然需要一些音譯到拉丁腳本。

回答

當更新的起源大多數的Linux操作系統已經在使用UTF-8作爲操作系統默認情況下,你也許可以簡單地做:

System.out.println("We are using encoding: " + System.getProperty("file.encoding")); 
System.out.println(s); 

這裏s轉換爲操作系統編碼。

+0

是的確切..我想防止?字符,我希望它打印PROJEAO的字符PROJECAO,實際上我能夠將它轉換時,我鍵入PROJEçãO字符串對象,但是當我從文件讀取它打印與PROJE? – anshulkatta

+0

「正則表達式將文本轉換爲帶有重音符號的ASCII文本。」你是什​​麼意思? Normalizer不會分割連字符(ß或œ),也不會分隔許多帶有變音符號(ø或ł)的字母。 –

+0

@KarolS是的,糟糕的表述(部分更正);打算澄清,如果不清楚。我在characer地圖中找不到ff或fi連字;因爲使用字符串的長度不是一個好主意。 –

1

有在ASCII字符集的匹配代碼點的ASCII character class

String s = "口水雞 hello Ä"; 

String s1 = Normalizer.normalize(s, Normalizer.Form.NFKD); 
String nonAscii = "[^\\p{ASCII}]+"; 
String s2 = s1.replaceAll(nonAscii, ""); 

System.out.println(s2); 
System.out.println(s.length() == s2.length()); 

由於Joop Eggan notes,Java字符串和char類型總是UTF-16。您只能在字節形式ASCII編碼的數據:

byte[] ascii = s2.getBytes(StandardCharsets.US_ASCII); 
+0

_Short and simple._通常的長度比較沒有意義。但似乎這是答案。任何其他問題都位於其他地方。然而,轉換仍然有意義,因爲有些解碼器可能會用ASCII引號替換特殊引號('「」')等。 –

相關問題