为什么这是真的字符串.编码('utf8')!=字节(map(ord,string))?

2024-10-08 21:22:41 发布

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

{cd1>我们考虑使用什么编码?为什么有时候string.encode('utf-8') != bytes(map(ord, string))是真的?在

当客户端javascript与django1.5(python3)应用程序交互时,我遇到了这个问题。在

基本上,我使用ajax和jDataView以字符串形式上传mp3文件(我找不到直接上传文件的解决方案)。我使用jDataView将文件转换为字符串。在我的Django应用程序中,当我保存文件时,它会改变大小。但是,如果不使用string.encode('utf-8')我使用bytes(map(ord, string))文件保存得很好。为什么?为什么string.encode('utf-8') != bytes(map(ord, string))?在

我的客户端代码如下所示:

function send(file) {
    var reader = new FileReader();
    reader.onload = function(event) {
        var self = this;
        $.ajax({
            url: 'upload/',
            type: 'POST'
            data: {contents: (new jDataView(self.result)).getString()}
        });
    }
    reader.readAsArrayBuffer(file);
}

我的观点是这样接收数据的:

^{pr2}$

我检查了JS代码和Python代码中的contents是同一件事。它们具有相同的字节长度,并且从适合我屏幕的前几个字符和最后几个字符来看,它们似乎具有相同的内容。在

如果我把代码改成

^{3}$

文件更改大小,不再是有效的mp3文件。在


Tags: 文件字符串代码应用程序客户端mapstringbytes
1条回答
网友
1楼 · 发布于 2024-10-08 21:22:41

UTF-8不会将Unicode码位直接映射到字节。只有在U+0000到U+007F范围内的ASCII码位才是这样。超过这个范围,UTF-8每个码位使用2个或更多字节:

>>> '\u007f'.encode('utf8')
b'\x7f'
>>> '\u0080'.encode('utf8')
b'\xc2\x80'

您考虑的是拉丁语-1编码,其中U+0000到U+00FF的代码点直接映射到字节:

^{pr2}$

与文本编码不同,您可以在存储之前对二进制数据进行base64编码,也可以升级到django1.6或更高版本,以使用binary field type。在

相关问题 更多 >

    热门问题