是否有任何免费的 java 库可用于将一种编码中的字符串转换为另一种编码,例如iconv
?我正在使用 Java 1.3 版。
4 回答
您不需要标准库之外的库 - 只需使用Charset。(您可以只使用 String 构造函数和 getBytes 方法,但我个人不喜欢只使用字符编码的名称。错别字的空间太大。)
编辑:正如评论中所指出的,您仍然可以使用 Charset 实例,但可以轻松使用 String 方法:new String(bytes, charset)和String.getBytes(charset)。
请参阅“ URL 编码(或:'那些“ %20
URL 中的代码是什么?') ”。
CharsetDecoder
应该是你要找的,不是吗?
许多网络协议和文件使用面向字节的字符集存储它们的字符,例如ISO-8859-1
( ISO-Latin-1
)。
但是,Java 的本机字符编码是统一码UTF16BE(十六位 UCS 转换格式,大端字节序)。
见Charset
。这并不意味着UTF16
是默认字符集(即:默认的“16 位Unicode 代码单元序列和字节序列之间的映射”):
Java 虚拟机的每个实例都有一个默认字符集,它可能是也可能不是标准字符集之一。
[US-ASCII
,ISO-8859-1
akaISO-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) {
}
我只想补充一点,如果字符串最初是使用错误的编码进行编码的,则可能无法将其更改为另一种编码而不会出错。这个问题并没有说明这里的转换是从错误的编码到正确的编码,但我个人只是因为这种情况而偶然发现了这个问题,所以也只是为其他人提个醒。
其他问题中的这个答案解释了为什么转换并不总是产生正确的结果 https://stackoverflow.com/a/2623793/4702806
如果您将 unicode 视为一个字符集(它实际上是 - 它基本上是所有已知字符的编号集),那就容易多了。您可以将其编码为 UTF-8(取决于每个字符 1-3 个字节)或 UTF-16(每个字符 2 个字节或使用代理对 4 个字节)。
回到 Java 过去使用 UCS-2 对 unicode 字符集进行编码的时间的迷雾中。这只能处理每个字符 2 个字节,现在已过时。添加代理对并升级到 UTF-16 是一个相当明显的 hack。
很多人认为他们应该首先使用 UTF-8。最初编写 Java 时,unicode 的字符数远远超过 65535 个......