gpt4 book ai didi

python - 从 Facebook 数据导出中解码看似格式错误的 Unicode 指针的 utf8 表示

转载 作者:行者123 更新时间:2023-12-04 09:35:07 24 4
gpt4 key购买 nike

类似于 this post , 有没有办法解码从 downloading a copy of my Facebook data 返回的一些看似格式不正确的 UTF-8 数据? ?
看一个特定的例子,在我的一个聊天中,我发送了一条仅包含表情符号💎的消息。开通message_1.json带有 vim 的文件并查看相应的条目会显示文本 "\u00f0\u009f\u0092\u008e" .但是,这与我的终端(Mac OSX)的 View 不同

$ jq '.messages[0].content' message_1.json
"ð" # stackoverflow seems to be truncating this string, there are 3 extra chars which show as spaces
$ jq '.messages[0].content' message_1.json > utf
$ cat utf
"ð"
$ od -h utf
0000000 c322 c2b0 c29f c292 228e 000a
0000013
$ wc utf
1 1 11 utf
这也不同于直接将表情符号粘贴到文件中的输出
$ echo '💎' > gem.txt
$ cat gem.txt
💎
$ od -h gem.txt
0000000 9ff0 8e92 000a
0000005
$ wc gem.txt
1 1 5 gem.txt
使用 python3 读取这两个文件时,我得到了看似不同的信息
$ python3
Python 3.7.3 (default, Dec 13 2019, 19:58:14)
[Clang 11.0.0 (clang-1100.0.33.17)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> with open('gem.txt', 'r') as f:
... gem = f.read()
...
>>> gem
'💎\n'
>>> len(gem)
2
>>> ord(gem[0])
128142
>>>
>>>
>>> with open('utf', 'r') as f:
... utf = f.read()
...
>>> utf
'"ð\x9f\x92\x8e"\n'
>>> len(utf)
7
>>> for char in utf:
... print(ord(char))
...
34
240
159
146
142
34
10
>>>
基于这种行为,我有几个问题:
  • Facebook返回的数据是否编码错误? This page显示 gem 表情符号的正确 Unicode 指针为 U+1F48E ,以及对应的 UTF-8 0xF0 0x9F 0x92 0x8E表示与 od 的字节输出匹配
  • 有没有办法让我解析从 Facebook 返回的字符串?似乎上一个问题建议在这样做之前使用正则表达式来转换文本,这是必需的吗?
  • gem.txt长度为 5 个字节,减去换行符,4 个字节代表表情符号。这对我来说很有意义,因为它的 UTF-8 表示需要 4 个字节。为什么 utf文档列表 11 个字节(大概 10 个没有换行符)?
  • 最佳答案

    看起来您的 JSON 文件的内容确实得到了 mojibaked,即。用错误的编码误解。

    >>> import json
    >>> # That's how it should look:
    >>> print(json.dumps('💎'))
    "\ud83d\udc8e"
    >>> # That's what you got:
    >>> mojibaked = '💎'.encode('utf8').decode('latin1')
    >>> print(json.dumps(mojibaked))
    "\u00f0\u009f\u0092\u008e"
    检查您是否可以修复 JSON 文件的创建方式。
    Latin-1 是某些工具/协议(protocol)中的默认值。
    方便的是,您始终可以毫无异常(exception)地将任何字节流解码为 Latin-1。
    它可能会破坏您的输入,就像这里发生的那样。
    如果您无法修复源,则可以通过反向执行编码往返来恢复:
    >>> mojibaked = json.loads('"\\u00f0\\u009f\\u0092\\u008e"')
    >>> mojibaked
    'ð\x9f\x92\x8e'
    >>> mojibaked.encode('latin1').decode('utf8')
    '💎'

    关于python - 从 Facebook 数据导出中解码看似格式错误的 Unicode 指针的 utf8 表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62628204/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com