有没有办法使用Java将ANSI字符串转换为UTF。
我有一个使用readUTF& amp;的自定义序列化器。 DataInputStream类的writeUTF方法用于反序列化和序列化字符串。如果我收到一个用ANSI编码的字符串太长,大约100000个字符我得到错误;
引起: java.io.UTFDataFormatException: 编码字符串太长:106958字节
然而,在我的Junit测试中,我能够创建一个120000'a的字符串并且它完美地运行
我已检查过以下帖子,但仍有错误;
答案 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。还有其他可能的解决方法来解决这个问题,有些可能会工作而不会破坏正在使用的实际二进制数据格式...