gpt4 book ai didi

python - 从终端解释 Unicode

转载 作者:行者123 更新时间:2023-11-30 23:17:11 26 4
gpt4 key购买 nike

我在将 Unicode 文本从 shell 读取到 Python 时遇到问题。我有一个包含以下元数据属性的测试文档:

kMDItemAuthors = (
"To\U0304ny\U0308 Sta\U030ark"
)

当我运行mdls -name kMDItemAuthors path/to/the/file时看到这个

我正在尝试在 Python 脚本中将此数据转换为可用的形式。但是,我无法将 Unicode 表示的文本转换为 Python 中的实际 Unicode。

这是我目前正在做的事情:

import unicodedata
import subprocess
import os
os.environ['LANG'] = 'en_US.UTF-8'
cmd = 'mdls -name kMDItemAuthors path/to/the/file'
proc = subprocess.Popen(cmd,
shell=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
(stdout, stderr) = proc.communicate()
u = unicode(stdout, 'utf8')
a = unicodedata.normalize('NFC', u)

现在,当我 print(a) 时,我得到与上面完全相同的字符串表示形式。我尝试过使用所有选项(NFCNFDNFKCNFKD)进行标准化,所有选项均使用相同的结果。

更奇怪的是,当我尝试这段代码时:

print('To\U0304ny\U0308 Sta\U030ark')

我收到以下错误:

SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-7: truncated \UXXXXXXXX escape

因此,当该子字符串位于变量内时,没有问题,但作为原始字符串,则会产生问题。

我曾感觉自己对 Python 和 Unicode 的理解相当深入,但现在 shell 却让我崩溃了。任何帮助将不胜感激。

PS。我在 Python 2.7.X 中运行所有这些

最佳答案

您遇到了多个问题。

  • 与所有转义序列一样,Python 仅解释 \U源代码中字符串文字中的序列。如果文件实际上有 \随后是 U在其中,Python 不会将其视为 \ 以外的任何内容。和一个 U ,就像对待 \ 一样。随后是 n作为换行符。如果您想手动取消转义它们,可以使用unicodeescape编解码器。 (但请注意,这会将您的文件视为 ASCII,而不是 UTF-8。如果您实际上同时拥有 UTF-8 \U 序列,则必须将其解码为 UTF8,然后对其进行编码使用 unicodeescape ,然后使用 unicodeescape 将其解码回来。)
  • Python \U序列需要 8 位数字,而不是 4 位。如果只有 4 位,则必须使用 \u 。因此,无论程序生成此字符串,都无法使用 unicodeescape 对其进行解析。 。您也许可以通过一些快速而肮脏的解决方法来将其整形,例如 s.replace(r'\U', r'\U0000')s.replace('r\U', r'\u') ,或者您可能必须为其编写一个简单的解析器。
  • 在您的测试中,您尝试使用 \U字符串文字中的转义。您只能在 Unicode 字符串文字中执行此操作,例如 print(u'To\U0304ny\U0308 Sta\U030ark') 。 (当然,如果您这样做,您将再次收到之前的错误。)

此外,由于这似乎是 Mac,您可能不应该执行 os.environ['LANG'] = 'en_US.UTF-8' 。如果 Python 发现它在 OS X 上,它会假设所有内容都是 UTF-8。您尝试强制使用 UTF-8 所做的任何操作都可能不会起任何作用,并且理论上可能会混淆它,因此它不会注意到它在 OS X 上。除非您尝试绕过驱动程序在调用脚本之前有意将区域设置设置为“C”,通常最好不要这样做。

关于python - 从终端解释 Unicode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27413801/

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