【发布时间】:2011-10-23 09:44:27
【问题描述】:
十六进制字符串'\xd3'也可以表示为:Ó。
我发现将十六进制字符串的字符表示到控制台的最简单方法是:
print unichr(ord('\xd3'))
或者用英语,将十六进制字符串转换为数字,然后将该数字转换为 unicode 代码点,最后将其输出到屏幕上。这似乎是一个额外的步骤。有没有更简单的方法?
【问题讨论】:
标签: python unicode hex codepoint
十六进制字符串'\xd3'也可以表示为:Ó。
我发现将十六进制字符串的字符表示到控制台的最简单方法是:
print unichr(ord('\xd3'))
或者用英语,将十六进制字符串转换为数字,然后将该数字转换为 unicode 代码点,最后将其输出到屏幕上。这似乎是一个额外的步骤。有没有更简单的方法?
【问题讨论】:
标签: python unicode hex codepoint
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)吗?
u 不是函数,它是字符串文字语法的一部分。但是什么是“由代码点组成的字符串”?
re 库来处理每个 UTS 的 Unicode #18 的 1 级要求。 Matthew Barnett 针对 Python2 和 Python3 的 regex library 有很大帮助。请参阅 my Unicode Support Shootout talk 的幻灯片 6 上的图表,了解 MRAB 的 regex 库比普通 Python re 好得多。唉,但是在 UCS‐²⁄₄ 上,你仍然有 Python 致命的多重人格障碍。
如果数据是这样的 "\xe0\xa4\xb9\xe0\xa5\x88\xe0\xa4\xb2\xe0\xa5\x8b \xe0\xa4\x95\xe0\xa4\xb2"
sys.stdout.buffer.write(data)
会打印
हैलो कल
【讨论】:
不久前,我遇到了一个非常相似的问题。我必须解码包含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 |
【讨论】: