2014-09-23 49 views
2

这与this question类似,但我特别需要知道如何转换为ISO-8859-1格式,而不是UTF-8。将组合字符集转换为ISO 8859-1

简短的问题:我需要一个字符结合diaereses转换为拉丁-1相当(如果存在)。 (UTF-8:[cc] [88]和另一个UTF代码点U + 0308),但我的数据库只支持ISO-8859-1(例如Latin-1 )。由于字符/合并字段是“分解”的,因为字节序列[cc] [88]作用于前面的字符,因此我不能将其转换为ISO-8859-1,因为前面的字符可能没有ISO中的对应字符-8859-1。

我试过这段代码:

import java.nio.charset.Charset; 
import java.nio.ByteBuffer; 
import java.nio.CharBuffer; 

//ü has combining diaereses 
String s = "für" 
Charset utf8charset = Charset.forName("UTF-8"); 
Charset iso88591charset = Charset.forName("ISO-8859-1"); 

ByteBuffer inputBuffer = ByteBuffer.wrap(s.getBytes()); 

// decode UTF-8 
CharBuffer data = utf8charset.decode(inputBuffer); 

// encode ISO-8559-1 
ByteBuffer outputBuffer = iso88591charset.encode(data); 
byte[] outputData = outputBuffer.array(); 

isoString = new String(outputData); 

//isoString is "fu?r" 

,但它只是不能编码合成diaereses,而不是看到,它可以转换为U + 00F6/[C3] [BC]。有没有一个库可以检测到一个字符后跟组合的字符串可以映射到现有的ISO-8859-1字符? (最好用Java)

回答

3

你需要在编码之前进行归一化处理。

使用the Normalizer class转换为分解形式,然后编码。

+0

Upvoted造成的。我将发布我的例子作为更明确示例的另一个答案。 – Devin 2014-09-23 23:52:17

1

阐述bmargulies的答案,正规化是关键。

这里是工作的代码:该工作

import java.nio.charset.Charset; 
import java.nio.ByteBuffer; 
import java.nio.CharBuffer; 
import java.text.Normalizer; 
import java.text.Normalizer.Form; 

private static String encodeToLatin1(byte[] input) { 
    String encodedString = null; 

    Charset utf8charset = Charset.forName("UTF-8"); 
    Charset latin1 = Charset.forName("ISO-8859-1"); 

    ByteBuffer inputBuffer = ByteBuffer.wrap(input); 
    CharBuffer data = utf8charset.decode(inputBuffer); 
    ByteBuffer outputBuffer = latin1.encode(Normalizer.normalize(data, Normalizer.Form.NFC)); 

    try { 
     encodedString = new String(outputBuffer.array(), "ISO-8859-1"); 
    } catch (UnsupportedEncodingException e) { 
     //do stuff  
    } 
    return encodedString; 
} 

//String with a combining diaereses and without 
String s = "Lösung für"  

//Returns "Lösung für" 
encodeToLatin1(s.getBytes()) 
相关问题