4

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

我有一个自定义序列化程序,它使用 DataInputStream 类的 readUTF 和 writeUTF 方法来反序列化和序列化字符串。如果我收到一个以 ANSI 编码的字符串并且太长,大约 100000 个字符长我会收到错误消息;

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

但是在我的 Junit 测试中,我可以创建一个包含 120000 'a's 的字符串,并且效果很好

我检查了以下帖子,但仍然有错误;

4

4 回答 4

6

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

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

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

这个限制是硬编码的,没有办法解决这个问题,

if (utflen > 65535)
    throw new UTFDataFormatException(
            "encoded string too long: " + utflen + " bytes");
于 2009-09-23T14:44:29.873 回答
3
byte[] asciiBytes = ...;
String unicode = new String(asciiBytes, "US-ASCII");
byte[] utfBytes = unicode.getBytes("UTF-8");
于 2009-09-23T14:03:55.617 回答
2

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

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

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

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

于 2009-09-23T14:21:26.863 回答
1

ZZ Coder 已经回答了这个问题,但我已经在这个博客上写了更详细的解释并提出了解决方法。基本上,问题出在 DataOutputStream 中,因为它将可写字符串限制为 64KB。还有其他可能的解决方法可以绕过这个问题,有些可能会在不破坏一个正在使用的实际二进制数据格式的情况下工作......

于 2011-02-20T13:48:22.283 回答