【问题标题】:Python unicode stringsPython Unicode 字符串
【发布时间】:2021-11-03 02:17:48
【问题描述】:

我是一名 Python 新手,我正在尝试制作一个脚本,如果存在差异,可以在文件中写入一些字符串。问题是原始字符串中有一些\uNNNN Unicode 格式的字符,我无法将新字符串转换为相同的 Unicode 格式。

我要比较的原始字符串:\u00A1 ATENCI\u00D3N! \u25C4

收到的新字符串为:¡ ATENCIÓN! ◄

这是代码

str = u'¡ ATENCIÓN! ◄'
print(str)
str1 = str.encode('unicode_escape')
print (str1)
str2 = str1.decode()
print (str2)

结果是:

¡ ATENCIÓN! ◄
b'\\xa1 ATENCI\\xd3N! \\u25c4'
\xa1 ATENCI\xd3N! \u25c4

那么,我怎样才能将 \xa1 ATENCI\xd3N! \u25c4 转换为 \u00A1 ATENCI\u00D3N! \u25C4,因为这是我可以保存的唯一 Unicode 格式?

注意:字符串中的字符大小写也需要相同才能比较。

【问题讨论】:

  • 在 Python 3 中,默认情况下所有字符串都是 Unicode,因此您的第一行可以简单地为 str = '¡ ATENCIÓN! ◄'。我不确定您要对其他行做什么。
  • 感谢第一行提示!我正在尝试将新字符串转换为与旧字符串相同的格式。
  • 请注意,str 是一种内置类型,因此非常不鼓励(且令人困惑)将其用作变量名。如果你想在更大的应用程序中这样做,你可能会破坏代码。
  • 为什么使用unicode_escape 编码并使用utf-8 解码(并期望它产生原始字符串)?如果您对两者使用相同的编码,您应该得到相同的结果。如果你使用不同的编码,你得到不同的结果是合乎逻辑的。

标签: python python-3.x unicode


【解决方案1】:

问题是,根据the docs(请仔细阅读,在转义序列表之间),\u\U\N Unicode 转义序列只能在字符串中识别文字。这意味着一旦文字在内存中被评估,例如在变量赋值中:

s = "\u00A1 ATENCI\u00D3N! \u25C4"

任何对str.encode() 的尝试都会自动将其转换为使用\x 的字节对象:

b'\\xa1 ATENCI\\xd3N! \\u25c4'

使用

b'\\xa1 ATENCI\\xd3N! \\u25c4'.decode("unicode_escape")

会将其转换回'¡ ATENCIÓN! ◄'。这使用字符的实际(预期)表示,而不是原始字符串 s\uXXXX 转义序列。

所以,你应该做的是不要搞乱编码和解码的事情。观察:

print("\u00A1 ATENCI\u00D3N! \u25C4" == '¡ ATENCIÓN! ◄')
True

这就是你需要做的所有比较。

如需进一步阅读,您可能对以下内容感兴趣:

【讨论】:

  • 感谢您的澄清!说得通。无论如何,使用来自github.com/Tblue/python-jproperties 的方法escape_non_ascii 找到了解决方法。这样我就可以通过打印escape_non_ascii(str) 得到我想要的
  • 这个答案有很多错误,但我会尽力解释:
  • (1) “Unicode 转义字符”是什么意思。所有字符都是 Unicode,没有理由“逃避 Unicode 字符”。如果您指的是“\u00A1”形式,那只是 Unicode 字符在 Python 中的一种表示方式。
  • (2) 在哪里声明它们“只允许在字符串文字中”?如果是这样,什么时候不允许?你能举个例子吗?
  • (3) “任何对str.encode() 的尝试都会自动将其转换为字节文字”。不,它将它转换为bytes,这就是它的作用。 '\xa1' (再次)只是数字在 Python 中的表示方式,如果它们不是标准的人类可读字符。在问题的情况下,使用了'unicode_decode'“编码”,它将Unicode字符'\u00A1'(长度为1的字符串)显式转换为字节序列['\\', 'x', 'a', '1'](长度为4)。
猜你喜欢
  • 2017-11-19
  • 2011-11-12
  • 2011-11-07
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
  • 2017-03-15
  • 1970-01-01
相关资源
最近更新 更多