Java中的编码转换

33

有没有任何免费的Java库可以用来将一个编码的字符串转换为另一个编码,类似于 iconv?我正在使用Java版本1.3。


4个回答

47

3
在大多数情况下,我更喜欢使用new String(byte[], encoding)和String.getBytes(encoding),因为它们只需要一行代码就能完成,相比之下Charset API更加强大但也更加复杂(顺便提一句,Charset API仅适用于Java 1.4及以上版本)。 - Alexander
3
是的,Charset API 很复杂,这真是一件遗憾的事情。在我看来,.NET 的 System.Encoding 类做得非常好,并且将功能保持在 String 之外。 - Jon Skeet
链接已修复。请参见http://www.free-scripts.net/html_tutorial/html/topics/urlencoding.htm。 - VonC

22

CharsetDecoder应该是你要找的东西,对吧?

许多网络协议和文件使用以字节为导向的字符集存储其字符,例如ISO-8859-1ISO-Latin-1)。
然而,Java的本地字符编码是Unicode UTF16BE(十六位UCS转换格式,大端字节顺序)。

请参阅Charset。这并不意味着UTF16是默认字符集(即:默认的“十六位Unicode代码单元序列与字节序列之间的映射”):

每个Java虚拟机实例都有一个默认字符集,可能是标准字符集之一,也可能不是。
[US-ASCII, ISO-8859-1(也称为ISO-LATIN-1),UTF-8,UTF-16BE,UTF-16LE,UTF-16]
默认字符集在虚拟机启动时确定,通常取决于底层操作系统使用的区域设置和字符集。
此示例演示了如何将ByteBuffer中的ISO-8859-1编码字节转换为CharBuffer中的字符串,以及反之。
// Create the encoder and decoder for ISO-8859-1
Charset charset = Charset.forName("ISO-8859-1");
CharsetDecoder decoder = charset.newDecoder();
CharsetEncoder encoder = charset.newEncoder();

try {
    // Convert a string to ISO-LATIN-1 bytes in a ByteBuffer
    // The new ByteBuffer is ready to be read.
    ByteBuffer bbuf = encoder.encode(CharBuffer.wrap("a string"));

    // Convert ISO-LATIN-1 bytes in a ByteBuffer to a character ByteBuffer and then to a string.
    // The new ByteBuffer is ready to be read.
    CharBuffer cbuf = decoder.decode(bbuf);
    String s = cbuf.toString();
} catch (CharacterCodingException e) {
}

5
Unicode不是一种编码方式!UTF-8、UTF-16 等才是。请参考http://www.joelonsoftware.com/articles/Unicode.html。 - Christian Klauser
@SealedSun:非常正确。我已经修复了我的答案中的“Java本地编码”部分。 - VonC

2
我想补充一点,如果字符串最初使用错误的编码进行编码,则可能无法在不出现错误的情况下将其更改为另一种编码。 该问题没有说明此处的转换是从错误的编码到正确的编码,但我个人因为这种情况而偶然遇到了这个问题,所以也提醒其他人注意一下。
另一个问题中的答案解释了为什么转换不总是产生正确的结果: https://dev59.com/z3E85IYBdhLWcg3wwWat#2623793

0

如果你把Unicode看作一个字符集(它实际上就是这样——基本上是所有已知字符的编号集),那么它会变得容易得多。你可以将其编码为UTF-8(每个字符1-3个字节,具体取决于字符)或者UTF-16(每个字符2个字节或者使用代理对4个字节)。

在很久以前,Java使用UCS-2来编码Unicode字符集。这种编码方式只能处理每个字符2个字节,现在已经过时了。添加代理对并升级到UTF-16是一种相当明显的hack。

很多人认为他们应该一开始就使用UTF-8。当Java最初编写时,Unicode已经有超过65535个字符了...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接