我试图将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;
}
请帮忙解决。 感谢。
答案 0 :(得分:0)
给出以下内容,
String str = new String(utf8Bytes, "UTF-8");
byte[] isoBytes = str.getBytes( "ISO-8859-1" );
如果它给出了完全相同的结果,那么您将拥有不在这些字符集之间映射的字符。
答案 1 :(得分:0)
首先,您可以使用StandardCharsets.UTF_8
和StandardCharsets.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 ....,这是一个“尾随字节”)