在Java中将ANSI字符转换为UTF-8

时间:2009-09-23 14:00:21

标签: java utf-8 character-encoding ansi

有没有办法使用Java将ANSI字符串转换为UTF。

我有一个使用readUTF& amp;的自定义序列化器。 DataInputStream类的writeUTF方法用于反序列化和序列化字符串。如果我收到一个用ANSI编码的字符串太长,大约100000个字符我得到错误;

  

引起:   java.io.UTFDataFormatException:   编码字符串太长:106958字节

然而,在我的Junit测试中,我能够创建一个120000'a的字符串并且它完美地运行

我已检查过以下帖子,但仍有错误;

4 个答案:

答案 0 :(得分:6)

此错误不是由字符编码引起的。这意味着UTF数据的长度是错误的。

编辑:刚刚意识到这是一个写错误,而不是读错误。

UTF长度仅为2个字节,因此它只能容纳64K UTF-8字节。你正在尝试写100K,它不会起作用。

此限制是硬编码的,无法解决此问题,

if (utflen > 65535)
    throw new UTFDataFormatException(
            "encoded string too long: " + utflen + " bytes");

答案 1 :(得分:3)

byte[] asciiBytes = ...;
String unicode = new String(asciiBytes, "US-ASCII");
byte[] utfBytes = unicode.getBytes("UTF-8");

答案 2 :(得分:2)

哪个ANSI codepage?有许多不同的字符编码都是“ANSI”。 DOS代码页是437(没有绘图符号)。如果您使用代码页850,则可以使用:

String unicode = new String(bytes, "IBM850");

(其中bytes是一个带有ANSI字符的数组)。之后,您可以使用unicode.getBytes(encoding)将此字符串转换为包含任何编码的字节数组。

Windows经常使用代码页1252(使用“windows-1252”)。

答案 3 :(得分:1)

ZZ Coder已经回答了这个问题,但我已经写了一个更详细的解释并建议this blog的解决方法。基本上,问题出在DataOutputStream中,因为它将可写String限制为64KB。还有其他可能的解决方法来解决这个问题,有些可能会工作而不会破坏正在使用的实际二进制数据格式...