将组合 diaerese 转换为 ISO 8859-1

Posted

技术标签:

【中文标题】将组合 diaerese 转换为 ISO 8859-1【英文标题】:Convert combining diaereses to 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)

【问题讨论】:

【参考方案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())

【讨论】:

以上是关于将组合 diaerese 转换为 ISO 8859-1的主要内容,如果未能解决你的问题,请参考以下文章

将 ISO-8859-1 转换为 UTF-8 [重复]

使用 NSString 将 UTF-8 编码转换为 ISO 8859-1 编码

将字符串从 UTF-8 转换为 ISO-8859-1

在 Java 中将 UTF-8 转换为 ISO-8859-1 - 如何将其保持为单字节

如何将汉字转换为iso-8859-1的字符串 - PHP进阶讨论

C# 将字符串从 UTF-8 转换为 ISO-8859-1 (Latin1) H