用于在字符编码之间进行转换的Java库

时间:2010-12-14 19:23:52

标签: java encoding character-encoding

我想解决的问题是在unicode存储类型之间进行转换。据我了解,UTF-8中的一个字符可以用1到4个字节的数据表示,而UTF-16中的字符可以用1-2个字节的数据块表示。这个可变长度意味着在两者之间进行转换并产生一些在英语中合理的东西是一种痛苦。

我正在寻找的是一个允许我指定语言或语言环境的库,以及一个存储机制(utf-8等),并让它产生更明智的结果。我在云中做梦吗?

4 个答案:

答案 0 :(得分:3)

String.getBytes(String charsetname)不够吗?

http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#getBytes(java.lang.String)

它允许您以特定编码获取String的原始字节。

String有一个[constructor] [2],它也将采用字节数组和字符集名称,因此您可以使用它进行解码。

[2]:http://download.oracle.com/javase/1.5.0/docs/api/java/lang/String.html#String(byte [],java.lang.String)

答案 1 :(得分:2)

您可以通过构造函数String(byte [],Charset)将一个编码中的字节转换为Java String。 java.nio.charset.Charset中列出了支持的字符集。

然后,您可以使用String.getBytes(CharSet)的不同编码转换回字节。

例如:

byte[] bytesIn = ...;
String s = new String( bytesIn, Charset.forName( "UTF-8" );
byte[] bytesOut = s.getBytes( Charset.forName( "UTF-16" ))

答案 2 :(得分:2)

很多字符集都是明智的。还有一些不适合Unicode,但不是很多。

首先要记住字节不是字符,以处理转换它们所需的字符,通常最简单的方法是在使用适当编码构造的Reader(或Writer)中包装字节流/解码集。

有关直接支持的编码的列表,here's what comes with the JVM

关键是不要使用默认的读者和写作者,因为他们使用平台的编码。而是选择一个编码。 UTF-8磁盘大小好,编码/解码性能差;而UTF-32的磁盘大小非常糟糕,编码/解码性能也很出色。 UTF-16是一种妥协。所有基于UTF的编码都可以更有效地处理ASCII字符,因此如果您只处理ASCII,UTF-8可能会击败UTF-16。

请注意,您无法将字节转换为新字符集,它们会“转换”为新字符集。这意味着如果要将字节转换为新的字符集,则必须将它们转换为字符串或字符,并在新字符集中获取字符串的字节。

使用您自己指定的字符集将字节流作为InputStream读取的一种方法是使用InputStreamReader constructed with an alternate character set。同样,您需要使用由备用字符集构造的OutputStreamWriter。

您未直接管理的所有文件都应使用平台字符集(因为这可能是它们将会是什么),并在保存或输入程序时转换为所选字符集。

答案 3 :(得分:1)