2013-05-15 49 views
3

當我將8859-1中未知的字符轉換爲UTF-8字符串到8859-1時,我在這裏和那裏都會出現問號。當然,他還能做什麼呢!UTF-8 - ISO 8859-1映射工具

是否有一個Java工具可以將「IKEA」這樣的字符串映射到「IKEA」並避免?爲了讓它變得更好?

+0

http://stackoverflow.com/questions/285228/how-to-convert-utf-8-to-us-ascii-in-java – kodmanyagha

+0

@Hasan對不起,我錯誤地投票結束後,重新閱讀upvoted你的題。 – stacker

+0

這個問題不是重複!建議的解決方案僅適用於US-ASCII,但iso8859-1還包含幾個字母,如ÄÜÜ應區別於İ(包含在utf-8中,但不包含在iso8859-1中) – stacker

回答

1

對於具體的例子,可以:

  • 分解使用兼容性形式的Unicode normalization
  • 字母和附加符號指示encoder下降不受支持的字符(附加符號)

實施例:

ByteArrayOutputStream out = new ByteArrayOutputStream(); 
// create encoder 
CharsetEncoder encoder = StandardCharsets.ISO_8859_1.newEncoder(); 
encoder.onUnmappableCharacter(CodingErrorAction.IGNORE); 
// write data 
String ikea = "\u0130KEA"; 
String decomposed = Normalizer.normalize(ikea, Form.NFKD); 
CharBuffer cbuf = CharBuffer.wrap(decomposed); 
ByteBuffer bbuf = encoder.encode(cbuf); 
out.write(bbuf.array()); 
// verify 
String decoded = new String(out.toByteArray(), StandardCharsets.ISO_8859_1); 
System.out.println(decoded); 

您仍然將定義了109,384個值(Unicode 6)的字符集轉碼爲支持256的字符集,因此始終存在限制。

另外考慮一個更復雜的轉換API,如ICU用於音譯等功能。