Python中Java修改的UTF-8字符串
我正在通过Python与Java应用程序交互。我需要能够构造包含UTF-8字符串的字节序列。Java在Python中Java修改的UTF-8字符串,java,python,utf-8,Java,Python,Utf 8,我正在通过Python与Java应用程序交互。我需要能够构造包含UTF-8字符串的字节序列。Java在DataInputStream.readUTF()中使用了Python()不支持的修改后的UTF-8编码 有人能告诉我在Python中构造Java修改的UTF-8字符串的正确方向吗 更新#1:要了解更多关于Java修改的UTF-8的信息,请从第550行的DataInput接口中查看readUTF()方法,或者 更新#2:我正在尝试与一个第三方JBoss web应用程序接口,该应用程序通过调用Da
DataInputStream.readUTF()
中使用了Python()不支持的修改后的UTF-8编码
有人能告诉我在Python中构造Java修改的UTF-8字符串的正确方向吗
更新#1:要了解更多关于Java修改的UTF-8的信息,请从第550行的DataInput接口中查看readUTF()
方法,或者
更新#2:我正在尝试与一个第三方JBoss web应用程序接口,该应用程序通过调用
DataInputStream.readUTF()
(很抱歉对正常的Java UTF-8字符串操作产生任何混淆)。好的,如果您需要阅读DataInput.readUTF>的格式,我猜想您只需要将(有良好文档记录的)格式转换为Python
这看起来并不是很难做到。在读取长度和二进制数据本身之后,我建议您使用第一次传递来计算输出中将包含多少Unicode字符,然后在第二次传递中相应地构造一个字符串。如果不了解Python,我不知道如何有效地构造字符串,但是考虑到链接的规范,我无法想象这会非常困难。您可能希望从现有UTF-8解码器的源代码入手。这可能会对您有所帮助,尽管看起来与您所做的相反:
您可以忽略修改的UTF-8编码(MUTF-8),将其视为UTF-8。在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))
将字符串转换为普通UTF-8,并将字节存储在缓冲区中
将2字节缓冲区长度(而不是字符串长度)写入big-endian中的二进制文件李>
写入整个缓冲区
我已经在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。以下是我创建的要点的一个例子。你所说的“修改的UTF-8”是什么意思?据我所知,如果您要求Java编码为UTF-8,它将使用完全标准的UTF-8。请注意,Java的原生字符串格式是UTF-16。嗨,Jon,我在DataInput接口中添加了一个指向readUTF方法的链接,其中提到了一点。我将尝试挖掘更多信息。Wikipedia上有一些信息:(序列化,一些JNI和类内字符串常量)。我建议修改Java应用程序以使用真正的UTF-8。谢谢McDowell,我正在尝试与JBoss web应用程序接口,该应用程序使用这种修改的utf8格式通过POST请求读取字符串。U+0000不是唯一的区别。对于将用UTF-16中的代理项对表示的代码点,修改的UTF-8对该对的每个组件进行编码,就像它们是单独的UTF-8代码点一样。这非常可怕,因为这意味着您必须从“修改的UTF-8”转换为UTF-16,然后再转换回来,以便对正确的代码点进行编码。我不认为您可以忽略它:UnicodeDecodeError:“UTF-8”编解码器无法对位置10处的字节0xc0进行解码:无效的起始字节