Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中Java修改的UTF-8字符串_Java_Python_Utf 8 - Fatal编程技术网

Python中Java修改的UTF-8字符串

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

我正在通过Python与Java应用程序交互。我需要能够构造包含UTF-8字符串的字节序列。Java在
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进行解码:无效的起始字节