将UTF-8 char转换为ISO-8859-1

时间:2014-07-08 11:37:13

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

我试图将UTF8 char转换为ISO-8859-1,但是所有字符(如0x84; 0x96;)都没有转换为ISO-8859-1,请参阅下面的代码在java中

    static byte[] encode(byte[] arr) throws CharacterCodingException{
           Charset utf8charset = Charset.forName("UTF-8");
           Charset iso88591charset = Charset.forName("ISO-8859-1");    
           ByteBuffer inputBuffer = ByteBuffer.wrap( arr );    
            // decode UTF-8
           CharBuffer data = utf8charset.decode(inputBuffer);    
           // encode ISO-8559-1
            ByteBuffer outputBuffer=  iso88591charset.newEncoder()
                .onMalformedInput(CodingErrorAction.REPLACE)
                .onUnmappableCharacter(CodingErrorAction.REPLACE)
                .encode(data); 
           data = iso88591charset.decode(outputBuffer);
           byte[] outputData = outputBuffer.array();    

           return outputData;
    }

请帮忙解决。 感谢。

3 个答案:

答案 0 :(得分:0)

给出以下内容,

    String str = new String(utf8Bytes, "UTF-8");

    byte[] isoBytes = str.getBytes( "ISO-8859-1" );

如果它给出了完全相同的结果,那么您将拥有不在这些字符集之间映射的字符。

答案 1 :(得分:0)

首先,您可以使用StandardCharsets.UTF_8StandardCharsets.ISO_8859_1

但是,最好用"ISO-8859-1"替换"Windows-1252"

原因是浏览器和其他人将ISO-8859-1(Latin-1)的指示解释为Windows-1252(Windows Latin-1)。在Windows Latin-1中,范围0x80 - 0xbf用于类似逗号的引号等。

所以有点运气(我不认为你的意思是浏览器),这将有效。

在浏览器中BTW甚至可以在Mac上运行,并且自HTML5以来一直是正式的。

答案 2 :(得分:0)

我的猜测是,当你说“0x84,0x96”时,你的意思是字节数组中的字节。 如果是这种情况,您将获取这些字节并尝试将它们解释为UTF-8,但是 该字节序列不是有效的UTF-8序列。

from U+0000  to U+007F   : 1 byte  :  0xxxxxxx
from U+0080  to U+07FF   : 2 bytes :  110xxxxx  10xxxxxx
from U+0800  to U+FFFF   : 3 bytes :  1110xxxx  10xxxxxx  10xxxxxx
from U+10000 to U+1FFFFF : 4 bytes :  11110xxx  10xxxxxx  10xxxxxx  10xxxxxx

由于84 96是0x10000100 0x10010110与上面的位模式不匹配 (注意引导字节中的0x11 ....或0x0 ....,永远不是0x10 ....,这是一个“尾随字节”)