【问题标题】:How to print Unicode like “u{variable}” in Python 2.7?如何在 Python 2.7 中打印像“u{variable}”这样的 Unicode?
【发布时间】:2018-04-21 16:50:57
【问题描述】:

例如,我可以打印这样的 Unicode 符号:

print u'\u00E0'

或者

a = u'\u00E0'
print a

但看起来我不能做这样的事情:

a = '\u00E0'
print someFunctionToDisplayTheCharacterRepresentedByThisCodePoint(a)

主要用例将在循环中。我有一个 unicode 代码点列表,我希望在控制台上显示它们。比如:

with open("someFileWithAListOfUnicodeCodePoints") as uniCodeFile:
    for codePoint in uniCodeFile:
        print codePoint #I want the console to display the unicode character here

该文件有一个 unicode 代码点列表。例如:

2109
OOBO
00E4
1F1E6

循环应该输出:

℉
°
ä
????  

任何帮助将不胜感激!

【问题讨论】:

  • 你能提供一个你想要的输出的确切例子吗?不清楚你想要什么,但它可能unicodedata.name(a)
  • 你不能把a = u'\u00E0'传给函数吗?
  • 我不确定您到底想要什么,但如果您尝试打印 unicode 文本文件的内容,我认为您当前的代码应该可以工作。
  • @chepner 我在问题中添加了示例输入和输出。
  • @Colin 不,我不能这样做,因为我没有字符串文字“00E0”。这个文字在一个变量中。例如 a = '00E0'。如果它是一个字符串文字,我可以像 u'\u00E0' 那样做。但是因为我有一个变量,所以我需要执行类似 a = u + "\u"+codePointVariable 的操作。这不是一个有效的调用,因为 unicode 指示符“u”在语句中不像那样工作。

标签: python unicode python-unicode


【解决方案1】:

你想要print unichr(int('00E0',16))。将十六进制字符串转换为整数并打印其 Unicode 代码点。

警告:在 Windows 代码点上 > U+FFFF 不起作用。

解决方案:使用 Python 3.3+ print(chr(int(line,16)))

在所有情况下,您仍然需要使用支持代码点字形的字体。

【讨论】:

    【解决方案2】:

    这些是 unicode 代码点,但缺少 \u python unicode-escape。所以,把它放进去:

    with open("someFileWithAListOfUnicodeCodePoints", "rb") as uniCodeFile:
        for codePoint in uniCodeFile:
            print "\\u" + codePoint.strip()).decode("unicode-escape")
    

    这是否适用于给定系统取决于控制台的编码。如果它是一个 Windows 代码页并且字符不在它的范围内,你仍然会得到时髦的错误。

    在 python 3 中,这将是 b"\\u"

    【讨论】:

      【解决方案3】:

      这可能不是一个好方法,但它是一个开始:

      >>> x = '00e4'
      >>> print unicode(struct.pack("!I", int(x, 16)), 'utf_32_be')
      ä
      

      首先,我们得到十六进制字符串x表示的整数。我们将其打包成一个字节字符串,然后我们可以使用utf_32_be 编码对其进行解码。

      由于你经常这样做,你可以预编译结构:

      int2bytes = struct.Struct("!I").pack
      with open("someFileWithAListOfUnicodeCodePoints") as fh:
          for code_point in fh:
              print unicode(int2bytes(int(code_point, 16)), 'utf_32_be')
      

      如果你觉得更清楚,也可以直接用decode方法代替unicode类型:

      >>> print int2bytes(int('00e4', 16)).decode('utf_32_be')
      ä
      

      Python 3 向 int 类添加了一个 to_bytes 方法,可让您绕过 struct 模块:

      >>> str(int('00e4', 16).to_bytes(4, 'big'), 'utf_32_be')
      "ä"
      

      【讨论】:

      • 是的,这行得通!但我希望有人也发布一个更简单的方法。这对我的水平来说太复杂了。非常感谢!我现在就用这个​​。
      猜你喜欢
      • 2017-08-03
      • 1970-01-01
      • 2020-08-07
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 2015-08-18
      • 2022-07-10
      相关资源
      最近更新 更多