在java中编码转换

有没有免费的Java库,我可以使用一个编码中的string转换为其他编码,像iconv在PHP中? 我正在使用Java版本1.3。

你不需要超出标准的库 – 只需使用字符集 。 (你可以使用String构造函数和getBytes方法,但是我个人不喜欢使用字符编码的名字,太多的拼写错误了。

编辑:正如在注释中指出的,你仍然可以使用Charset实例,但易于使用的string方法: 新的string(字节,字符集)和String.getBytes(字符集) 。

CharsetDecoder应该是你正在寻找的,不是吗?

许多networking协议和文件使用面向字节的字符集(如ISO-8859-1ISO-Latin-1 ))存储其字符。
但是,Java的本地字符编码是 统一 UTF16BE(十六位UCS转换格式,big-endian字节顺序)。

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

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

本示例演示如何将ByteBuffer中的ISO-8859-1编码字节转换为CharBuffer的string,反之亦然。

 // 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) { } 

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

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

如果你把unicode看作一个字符集(它实际上是 – 它基本上是所有已知字符的编号集合),这将变得更加容易。 您可以将其编码为UTF-8(每个字符1-3个字节)或UTF-16(每个字符2个字节或使用代理对的4个字节)。

早在Java曾经使用UCS-2来编码unicode字符集的时代。 这只能处理每个字符2个字节,现在已经过时了。 添加代理对并向上移动到UTF-16是一个相当明显的黑客行为。

很多人认为他们应该首先使用UTF-8。 当Java最初写unicode有远超过65535个字符…

UTF-8和UCS-2 / UTF-16可以通过文件开始处的字节顺序标记进行合理区分。 如果存在这样的话,那么这个文件就是用这种编码方式来打赌 – 但这并不是一个确定的事情。 您也可能发现该文件位于其中一种编码中,但没有字节顺序标记。

我不太了解ISO-8859-2,但是如果几乎每个文件都是该编码中的有效文本文件,我都不会感到惊讶。 你能做的最好的是启发式地检查它。 事实上,维基百科页面谈到它会build议只有字节0x7f是无效的。

没有读“按原样”的文件,也没有文本输出 – 文件是一个字节序列,所以你必须应用字符编码,以便将这些字节解码为字符。

来源由stackoverflow