Java在Python中修改了UTF-8字符串

时间:2009-09-08 09:40:02

标签: java python utf-8

我通过Python与Java应用程序连接。我需要能够构造包含utf-8字符串的字节序列。 Java在DataInputStream.readUTF()中使用修改后的utf-8编码,python(yet at least)不支持

有人能指出我在python中构造java修改的utf-8字符串的正确方向吗?

更新#1:要了解有关java修改的utf-8的更多信息,请查看550行herehere in the Java SE docs上的DataInput接口中的readUTF方法。

更新#2:我正在尝试与第三方JBoss网络应用程序进行交互,该应用程序正在使用此修改后的utf8格式通过调用DataInputStream.readUTF来读取字符串中的字符串(对于普通java utf8字符串操作的任何混淆感到抱歉)

提前致谢。

4 个答案:

答案 0 :(得分:5)

您可以忽略已修改的UTF-8编码(MUTF-8),并将其视为UTF-8。在Python方面,您可以像这样处理它,

  1. 将字符串转换为普通的UTF-8并将字节存储在缓冲区中。
  2. 在big-endian中将2字节缓冲区长度(不是字符串长度)写为二进制。
  3. 编写整个缓冲区。
  4. 我已经在PHP中完成了这项工作,并且Java根本没有抱怨我的编码(至少在Java 5中)。

    MUTF-8主要用于JNI和其他具有空终止字符串的系统。与普通UTF-8的唯一区别是U + 0000是如何编码的。普通UTF-8使用1字节编码(0x00),MUTF-8使用2字节(0xC0 0x80)。首先,您不应该在任何Unicode文本中使用U + 0000(无效的代码点)。其次,DataInputStream.readUTF()不强制执行编码,因此很乐意接受任何一种编码。

    编辑:Python代码应如下所示,

    def writeUTF(data, str):
        utf8 = str.encode('utf-8')
        length = len(utf8)
        data.append(struct.pack('!H', length))
        format = '!' + str(length) + 's'
        data.append(struct.pack(format, utf8))
    

答案 1 :(得分:1)

好的,如果您需要阅读DataInput.readUTF的格式,我怀疑您只需将(记录良好的)格式转换为Python。

看起来并不是特别难以做到。在读取长度然后读取二进制数据本身之后,我建议您使用第一遍来计算出输出中将包含多少个Unicode字符,然后在第二遍中相应地构造一个字符串。在不知道Python的情况下,我不知道如何有效地构造字符串的细节,但鉴于链接的规范,我无法想象它会非常困难。您可能希望将现有UTF-8解码器的源作为起点。

答案 2 :(得分:1)

我知道这个问题非常陈旧,但我仍然想做出贡献,因为我遇到了同样的问题并解决了它

我在openjdk源代码中找到了这个修改后的utf8的实现,并将其转换为python。这是我创建的要点的link

答案 3 :(得分:0)

也许这可以帮助你,虽然它看起来与你正在做的相反:

Connecting a Java applet to a python SocketServer