Python中Java修改的UTF8字符串

2024-06-16 12:52:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在通过Python与Java应用程序接口。我需要能够构造包含utf-8字符串的字节序列。Java在中使用了修改过的utf-8编码数据输入流.readUTF()python不支持(yet at least

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

更新1:要进一步了解java修改的utf-8,请在第550行here,或here in the Java SE docs上的DataInput接口查看readUTF方法。在

更新2:我正在尝试与第三方JBoss web应用程序接口,该应用程序使用这种修改过的utf8格式,通过调用POST请求读入字符串数据输入流.readUTF(对于任何关于普通javautf8字符串操作的混淆,很抱歉)。在

提前谢谢。在


Tags: 字符串in字节here序列javaatutf
3条回答

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

  1. 将字符串转换为普通UTF-8并将字节存储在缓冲区中。在
  2. 用big-endian将2字节缓冲区长度(不是字符串长度)写为二进制。在
  3. 写入整个缓冲区。在

我用PHP做过,Java根本没有抱怨我的编码(至少在java5中是这样)。在

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))

我知道这个问题很古老,但我仍然想贡献自己的力量,因为我遇到了同样的问题并解决了它

我在openjdk源代码中找到了这个修改过的utf8的实现,并将其翻译成python。以下是我所创建的要点的一个link。在

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

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

相关问题 更多 >