【问题标题】:Convert combining diaereses to ISO 8859-1将组合 diaerese 转换为 ISO 8859-1
【发布时间】:2014-09-23 21:09:33
【问题描述】:

这类似于this question,但我特别需要知道如何转换为 ISO-8859-1 格式,而不是 UTF-8。

简短的问题:我需要一个将分音符组合转换为拉丁语 1 等价物(如果存在)的字符。

更长的问题:我的德语字符串包含组合分音符号(UTF-8:[cc][88] AKA UTF 代码点 U+0308),但我的数据库仅支持 ISO-8859-1(例如 Latin-1) .因为字符/组合分音符被“分解”,我不能只是“转换”为 ISO-8859-1,因为字节序列 [cc][88] 作用于前面的字符,在 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"

但它只是无法对组合分音符号进行编码,而不是看到它可以转换为 U+00F6/[c3][bc]。是否有一个库可以检测一个字符后跟分音符号何时可以映射到现有的 ISO-8859-1 字符? (最好是Java)

【问题讨论】:

    标签: java encoding utf-8 iso-8859-1


    【解决方案1】:

    编码前需要标准化。

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

    【讨论】:

    • 赞成,因为有效。我将发布我的示例作为更明确示例的另一个答案。
    【解决方案2】:

    解释 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())
    

    【讨论】:

      猜你喜欢
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-19
      • 2014-08-29
      • 2014-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多