32

是否有任何免费的 java 库可用于将一种编码中的字符串转换为另一种编码,例如iconv?我正在使用 Java 1.3 版。

4

4 回答 4

45

您不需要标准库之外的库 - 只需使用Charset。(您可以只使用 String 构造函数和 getBytes 方法,但我个人不喜欢只使用字符编码的名称。错别字的空间太大。)

编辑:正如评论中所指出的,您仍然可以使用 Charset 实例,但可以轻松使用 String 方法:new String(bytes, charset)String.getBytes(charset)

请参阅“ URL 编码(或:'那些“ %20URL 中的代码是什么?') ”。

于 2008-10-23T08:57:41.043 回答
22

CharsetDecoder应该是你要找的,不是吗?

许多网络协议和文件使用面向字节的字符集存储它们的字符,例如ISO-8859-1( ISO-Latin-1)。
但是,Java 的本机字符编码是统一码UTF16BE(十六位 UCS 转换格式,大端字节序)。

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

Java 虚拟机的每个实例都有一个默认字符集,它可能是也可能不是标准字符集之一。
[ US-ASCII, ISO-8859-1aka ISO-LATIN-1, UTF-8, UTF-16BE, UTF-16LE, UTF-16]
默认字符集在虚拟机启动期间确定,通常取决于底层操作系统使用的语言环境和字符集。

此示例演示如何将a 中的ISO-8859-1编码字节转换ByteBuffer为 a 中的字符串,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) {
}
于 2008-10-23T08:57:21.123 回答
2

我只想补充一点,如果字符串最初是使用错误的编码进行编码的,则可能无法将其更改为另一种编码而不会出错。这个问题并没有说明这里的转换是从错误的编码到正确的编码,但我个人只是因为这种情况而偶然发现了这个问题,所以也只是为其他人提个醒。

其他问题中的这个答案解释了为什么转换并不总是产生正确的结果 https://stackoverflow.com/a/2623793/4702806

于 2015-09-02T10:31:47.603 回答
0

如果您将 unicode 视为一个字符集(它实际上是 - 它基本上是所有已知字符的编号集),那就容易多了。您可以将其编码为 UTF-8(取决于每个字符 1-3 个字节)或 UTF-16(每个字符 2 个字节或使用代理对 4 个字节)。

回到 Java 过去使用 UCS-2 对 unicode 字符集进行编码的时间的迷雾中。这只能处理每个字符 2 个字节,现在已过时。添加代理对并升级到 UTF-16 是一个相当明显的 hack。

很多人认为他们应该首先使用 UTF-8。最初编写 Java 时,unicode 的字符数远远超过 65535 个......

于 2009-08-29T17:34:35.427 回答