java中的编码转换

Posted

技术标签:

【中文标题】java中的编码转换【英文标题】:Encoding conversion in java 【发布时间】:2010-09-18 17:53:04 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

见“URL Encoding (or: 'What are those "%20" codes in URLs?')”。

【讨论】:

在大多数情况下我更喜欢 new String(byte[], encoding) 和 String.getBytes(encoding),因为它们是简单的单行代码,而不是更强大但更复杂的 Charset API (顺便说一句,它仅在 Java 1.4+ 中可用)。 是的,很遗憾 Charset API 如此复杂。 .NET System.Encoding 类在这方面做得非常好,IMO - 并且将功能排除在 String 之外。 链接已修复。见free-scripts.net/html_tutorial/html/topics/urlencoding.htm【参考方案2】:

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

许多网络协议和文件使用面向字节的字符集存储其字符,例如 ISO-8859-1 (ISO-Latin-1)。 但是,Java 的原生字符编码是UnicodeUTF16BE(16 位 UCS 转换格式,大端字节序)。

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

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) 

【讨论】:

Unicode 不是编码! UTF-8、UTF-16 等都是。见joelonsoftware.com/articles/Unicode.html @SealedSun:非常正确。我已经在我的答案中修复了“java 本机编码”部分。【参考方案3】:

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

this answer in other question解释了为什么转换并不总是产生正确的结果 https://***.com/a/2623793/4702806

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

以上是关于java中的编码转换的主要内容,如果未能解决你的问题,请参考以下文章

javaIO流之字节到字符流的转换流

如何在 ios 中将 Base64 编码的 NSString 转换为字节数组(Java)?

JAVA里的编码转换,懂的进来看看!!!!!

Java字符编码,ISO到UTF的转换

DER,CRT,CER,PEM证书以及如何转换它们

java编码,问题?