我想要一个包含 utf-8 中的阿姆哈拉语字母表的列表。字符范围是从 U+1200 到 U+1399。我使用的是Windows 8。我遇到了
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 0-5: truncated \UXXXXXXXX escape
。
我尝试过这个:
[print(c) for c in u'U1399']
如何列出字符?
要打印从 U-1200 到 U-1399 的字符,我将使用带有
for
控制变量的 int
循环。使用 chr()
将数字转换为字符非常简单。
整数值 0x1200(即十六进制的 1200)可以转换为 Unicode 代码点 U-1200,如下所示:
chr(0x1200) == '\u1200'
。
同样适用于 0x1201、0x1202、...0x1399。
请注意,我们使用
.isprintable()
来过滤掉代码中一些无用的条目。
print(' '.join(chr(x) for x in range(0x1200, 0x139A) if chr(x).isprintable()))
或
for x in range(0x1200, 0x139A):
if chr(x).isprintable():
print(hex(x), chr(x))
请注意,代码示例需要Python3。
一个老问题,但我会添加一个替代答案以供将来参考。
OP 希望使用 Unicode 范围 U+1200 到 U+1399 打印阿姆哈拉语字母,并且提供的答案基于 Unicode 范围 U+1200..U+1399 的解决方案。此范围包括两个 Unicode 块,其中包括标点符号、数字、未分配的代码点以及阿姆哈拉语中未使用的字母。基本上提供的解决方案包括很多阿姆哈拉语音节字符。
公共区域设置数据存储库包含有关各种区域设置的字符使用信息(示例数据)。这包括主要范例,即该语言/区域设置所需的字母。辅助范例,可用于外来词或外来词的附加字母。和索引范例。该数据可通过 icu4c 和 PyICU 访问:
import icu
# Create a LocaleData object for the Amharic Locale
# Use a locale label (string) rather than a Locale object.
ld = icu.LocaleData('am')
# Generate a Unicode Set containing the main (standard) exemplars.
exemplars = ld.getExemplarSet(icu.ULocaleDataExemplarSetType.ES_STANDARD)
# Typecast the UnicodeSet object to a list
exemplars_list = list(exemplars)
# Print list
print(*exemplars_list, sep=" ")
或将它们全部串在一起:
exemplars_list = list(icu.LocaleData('am').getExemplarSet(icu.ULocaleDataExemplarSetType.ES_STANDARD))
您发布的代码根本不会产生任何错误:
>>> [print(c) for c in u'U1399']
U
1
3
9
9
[None, None, None, None, None]
它也没有任何非 ASCII 字符。
您可能想使用 Unicode 反斜杠转义。你的问题可能更像是这样:
>>> u'\U1399'
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 0-5: truncated \UXXXXXXXX escape
原因是,正如错误消息所暗示的那样,
\U
转义需要 8 个十六进制数字,而您只提供了 4 个。所以:
>>> u'\U00001399'
'᎙'
但是有一个不同的转义符,序列
\u
(注意小写u
),它只需要4位数字:
>>> u'\u1399'
'᎙'
如果您使用的是 Python 2.7,甚至可能在 Windows 上使用 Python 3,您可能看不到那个漂亮的输出,而是看到带有反斜杠转义的内容。但如果您
print
该字符串,您将看到正确的字符。
\U
和\u
转义(以及其他转义)的完整详细信息记录在字符串和字节文字中(确保切换到您实际使用的Python版本,因为细节可能不同,尤其是2.x 和 3.x 之间),但通常您不需要了解比上面解释的更多的信息。