【问题标题】:Convert ANSI characters to UTF-8 in Java在 Java 中将 ANSI 字符转换为 UTF-8
【发布时间】:2010-11-30 18:32:26
【问题描述】:

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

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

原因: java.io.UTFDataFormatException: 编码字符串太长:106958 字节

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

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

【问题讨论】:

  • 你的意思是ASCII吗?如果是这样,它已经是 UTF-8 - 你能解释一下吗?显示错误等。
  • 无 ANSI != ASCII。 ANSI 是一个完整的代码页集合。
  • 由于 readUTF 和 writeUTF 的大小限制,我修改了我的序列化程序,分部分发送文本

标签: java utf-8 character-encoding ansi


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    此错误不是由字符编码引起的。表示UTF数据长度错误。

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

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

    这个限制是硬编码的,没有办法绕过这个,

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

    【讨论】:

    • 很有趣,但为什么我的所有字符多的测试都通过了?
    • 你必须向我展示你的测试用例。他们错了。查看我的编辑。
    • 我使用以下代码生成测试字符串; StringBuffer sb2 = new StringBuffer(); for (int i=0; i
    • 您可以创建长字符串,直到内存用完。您不能使用 writeUTF() 编写长字符串。使用 4 字节长度的标头以您自己的方式编写。
    【解决方案3】:
    byte[] asciiBytes = ...;
    String unicode = new String(asciiBytes, "US-ASCII");
    byte[] utfBytes = unicode.getBytes("UTF-8");
    

    【讨论】:

    • 看来我误读了有关 ASCII 与 ANSI 的原始问题,并且在最新的问题编辑中,我的回答并不真正相关。
    【解决方案4】:

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

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

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

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

    【讨论】:

    • 试过但不起作用,我得到同样的错误。有没有办法检查字符串中的编码,以便我可以确定它的 ANSI?
    • 这会将 ANSI 从 telnet 转换为“常规”字符串,就像玩泥巴游戏一样?
    • 这会将字节从任何来源转换为 Unicode 字符串。但要使其正常工作,您需要确切知道源使用的是哪种编码。不管是文件、远程服务还是硬件设备。
    猜你喜欢
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    • 2012-01-08
    • 2017-07-21
    • 2012-02-22
    相关资源
    最近更新 更多