如何在 Python 2.7 中像“u{variable}”一样打印 Unicode?
How to print Unicode like “u{variable}” in Python 2.7?
例如,我可以像这样打印 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
循环应该输出:
℉
°
ä
任何帮助将不胜感激!
这可能不是一个好方法,但它是一个开始:
>>> 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 添加了一个 to_bytes
方法到 int
class 让你绕过 struct
模块:
>>> str(int('00e4', 16).to_bytes(4, 'big'), 'utf_32_be')
"ä"
这些是 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"
。
你想要print unichr(int('00E0',16))
。将十六进制字符串转换为整数并打印其 Unicode 代码点。
警告:在 Windows 代码点 > U+FFFF 将不起作用。
解决方案:使用Python 3.3+ print(chr(int(line,16)))
在所有情况下,您仍然需要使用支持代码点字形的字体。
例如,我可以像这样打印 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
循环应该输出:
℉
°
ä
任何帮助将不胜感激!
这可能不是一个好方法,但它是一个开始:
>>> 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 添加了一个 to_bytes
方法到 int
class 让你绕过 struct
模块:
>>> str(int('00e4', 16).to_bytes(4, 'big'), 'utf_32_be')
"ä"
这些是 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"
。
你想要print unichr(int('00E0',16))
。将十六进制字符串转换为整数并打印其 Unicode 代码点。
警告:在 Windows 代码点 > U+FFFF 将不起作用。
解决方案:使用Python 3.3+ print(chr(int(line,16)))
在所有情况下,您仍然需要使用支持代码点字形的字体。