【问题标题】:Convert from hex character to Unicode character in python在python中从十六进制字符转换为Unicode字符
【发布时间】:2011-10-23 09:44:27
【问题描述】:

十六进制字符串'\xd3'也可以表示为:Ó

我发现将十六进制字符串的字符表示到控制台的最简单方法是:

print unichr(ord('\xd3'))

或者用英语,将十六进制字符串转换为数字,然后将该数字转换为 unicode 代码点,最后将其输出到屏幕上。这似乎是一个额外的步骤。有没有更简单的方法?

【问题讨论】:

    标签: python unicode hex codepoint


    【解决方案1】:
    print u'\xd3'
    

    这就是你所要做的。你只需要以某种方式告诉 Python 它是一个 unicode 文字;领先的u 就是这样做的。它甚至适用于多个字符。

    如果您不是在谈论文字,而是在谈论变量:

    codepoints = '\xd3\xd3'
    print codepoints.decode("latin-1")
    

    编辑:如果printing 与您的终端编码不兼容,则指定特定编码将不起作用,因此只需让print 自动执行encode(sys.stdout.encoding)。谢谢@ThomasK。

    【讨论】:

    • 但是,如果你有一个由代码点组成的字符串,你会怎么做?您如何将字符串转换为实际的字符串表示形式? u 是一个函数吗?我们可以写u(some_string)吗?
    • @Geo:u 不是函数,它是字符串文字语法的一部分。但是什么是“由代码点组成的字符串”?
    • @ThomasK 我无法检查,因为我认为我的终端是 latin-1 或那么愚蠢,几乎相同的 winodws 编码。它对我有用。
    • 它在 Python3 中要好一些(Python2 正在被淘汰),但即使在最好的日子里,Unicode 和 Python 也不能很好地相处,而且你不能使用 Python 的 re 库来处理每个 UTS 的 Unicode #18 的 1 级要求。 Matthew Barnett 针对 Python2 和 Python3 的 regex library 有很大帮助。请参阅 my Unicode Support Shootout talk 的幻灯片 6 上的图表,了解 MRAB 的 regex 库比普通 Python re 好得多。唉,但是在 UCS‐²⁄₄ 上,你仍然有 Python 致命的多重人格障碍
    • 版主说明 此答案下的几个 cmets 已被删除,因为它们提供的噪​​音多于信号。请尽量让 cmets 保持建设性和主题,与手头的答案相关。如果您想进行“边聊”,请使用聊天系统。
    【解决方案2】:

    如果数据是这样的 "\xe0\xa4\xb9\xe0\xa5\x88\xe0\xa4\xb2\xe0\xa5\x8b \xe0\xa4\x95\xe0\xa4\xb2"

    sys.stdout.buffer.write(data) 
    

    会打印

    हैलो कल
    

    【讨论】:

      【解决方案3】:

      不久前,我遇到了一个非常相似的问题。我必须解码包含unicode hex(例如_x0023_)而不是特殊字符(例如#)的文件。解决方案在以下代码中描述:

      脚本

      from collections import OrderedDict
      import re
      
      
      def decode_hex_unicode_to_latin1(string: str) -> str:
          hex_unicodes = list(OrderedDict.fromkeys(re.findall(r'_x[?:\da-zA-Z]{4}_', string)))
      
          for code in hex_unicodes:
              char = bytes.fromhex(code[2:-1]).decode("latin1")[-1]
              string = string.replace(code, char)
      
          return string
      
      
      def main() -> None:
          string = "|_x0020_C_x00f3_digo_x0020_|"
          decoded_string = decode_hex_unicode_to_latin1(string)
          print(string, "-->", decoded_string)
      
          return
      
      
      if __name__ == '__main__':
          main()
      

      输出

      |_x0020_C_x00f3_digo_x0020_| --> | Código |
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-22
        • 2013-10-09
        • 2016-05-10
        • 1970-01-01
        • 2018-01-31
        • 2021-03-21
        • 2023-03-04
        • 2023-04-03
        相关资源
        最近更新 更多