【问题标题】:Reading utf-8 escape sequences from a file从文件中读取 utf-8 转义序列
【发布时间】:2014-07-18 23:38:26
【问题描述】:

我有一个包含多行的 utf-8 编码文件,例如

\x02我不喜欢 \x0307bananas\x03.\x02 嗨,你好吗? 你打过电话了?

如何将该文件的行读入列表,解码所有转义序列? 我尝试了以下代码:

with codecs.open(file, 'r', encoding='utf-8') as q:
    quotes = q.readlines()

print(str(random.choice(quotes)))

但它在不解码转义字符的情况下打印该行。

\x02我不喜欢\x0307bananas\x03\x02

(注意:转义字符是 IRC 颜色代码,\x02 是粗体文本字符,\x03 是颜色代码前缀。此外,此代码来自我的 IRC 机器人,MSG 函数替换为 @987654324 @)

【问题讨论】:

    标签: python python-unicode utf8-decode


    【解决方案1】:

    根据this answer,更改以下应该会有预期的结果。

    在 Python 3 中

    codecs.open(file, 'r', encoding='utf-8')

    codecs.open(file, 'r', encoding='unicode_escape')

    在 Python 2 中

    codecs.open(file, 'r', encoding='string_escape')

    【讨论】:

      【解决方案2】:

      如果您想以相同的格式将文本输出到控制台,那么重点是,UNIX(或您使用什么操作系统?)使用与 IRC 中不同的 ANSI 转义序列,因此您必须将 IRC 格式转换为UNIX 格式。这些是开始的链接:
      https://stackoverflow.com/a/287944/2660503
      Color text in terminal applications in UNIX

      如果您想在不格式化的情况下打印文本,只需使用正则表达式清理它即可。

      【讨论】:

      • 谢谢,但 sn-p 来自我的 IRC 机器人,我刚刚将 MSG 函数替换为 print()。我将编辑我的问题以提及这一点。
      【解决方案3】:

      正如一些人建议的那样,解决方案是使用codecs.open(file, 'r', encoding='unicode_escape'),一旦实施,它将如下所示:

      with codecs.open(file, 'r', encoding='unicode_escape') as q:
          quotes = q.readlines()
      
      print(str(random.choice(quotes)))
      

      如果您使用常规 utf-8 解码,\x02I don't like \x0307bananas\x03.\x02 的结果实际上将是 "\\x02I don't like \\x0307bananas\\x03.\\x02\n",因为 readlines() 方法将为您转义字符

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-04
        • 2014-10-26
        相关资源
        最近更新 更多