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中的编码转换的主要内容,如果未能解决你的问题,请参考以下文章