前言:你的查看器能工作吗?
确保您的查看器/编辑器/终端(无论您与utf-8编码的文件进行交互)可以读取该文件。这在Windows上经常是一个问题,例如,记事本。
将Unicode文本写入文本文件?
在Python 2中,使用io模块中的open(这与Python 3中内置的open相同):
import io
一般来说,最佳实践是使用UTF-8写入文件(使用UTF-8我们甚至不必担心字节顺序)。
encoding = 'utf-8'
Utf-8是最现代和最通用的编码-它适用于所有的网络浏览器,大多数文本编辑器(如果有问题请参阅您的设置)和大多数终端/shell。
在Windows上,如果限于在记事本(或其他有限的查看器)中查看输出,可以尝试utf-16le。
encoding = 'utf-16le' # sorry, Windows users... :(
用上下文管理器打开它,把你的unicode字符写出来:
with io.open(filename, 'w', encoding=encoding) as f:
f.write(unicode_object)
使用多个Unicode字符的示例
下面是一个例子,它试图将每个可能的字符映射到3位宽(4是最大值,但这有点远),从数字表示(整数)到编码的可打印输出,以及它的名称,如果可能的话(把它放到一个名为uni.py的文件中):
from __future__ import print_function
import io
from unicodedata import name, category
from curses.ascii import controlnames
from collections import Counter
try: # use these if Python 2
unicode_chr, range = unichr, xrange
except NameError: # Python 3
unicode_chr = chr
exclude_categories = set(('Co', 'Cn'))
counts = Counter()
control_names = dict(enumerate(controlnames))
with io.open('unidata', 'w', encoding='utf-8') as f:
for x in range((2**8)**3):
try:
char = unicode_chr(x)
except ValueError:
continue # can't map to unicode, try next x
cat = category(char)
counts.update((cat,))
if cat in exclude_categories:
continue # get rid of noise & greatly shorten result file
try:
uname = name(char)
except ValueError: # probably control character, don't use actual
uname = control_names.get(x, '')
f.write(u'{0:>6x} {1} {2}\n'.format(x, cat, uname))
else:
f.write(u'{0:>6x} {1} {2} {3}\n'.format(x, cat, char, uname))
# may as well describe the types we logged.
for cat, count in counts.items():
print('{0} chars of category, {1}'.format(count, cat))
这应该以大约一分钟的顺序运行,您可以查看数据文件,如果您的文件查看器可以显示unicode,您就可以看到它。关于这些类别的信息可以在这里找到。基于计数,我们可以通过排除Cn和Co类别来改进结果,因为它们没有与之相关的符号。
$ python uni.py
它将显示十六进制映射、类别、符号(除非无法获取名称,所以可能是控制字符)和符号的名称。如。
我建议Unix或Cygwin少一些(不要打印/cat整个文件到输出中):
$ less unidata
例如,将显示类似于下面的行,这是我使用Python 2 (unicode 5.2)从它采样的:
0 Cc NUL
20 Zs SPACE
21 Po ! EXCLAMATION MARK
b6 So ¶ PILCROW SIGN
d0 Lu Ð LATIN CAPITAL LETTER ETH
e59 Nd ๙ THAI DIGIT NINE
2887 So ⢇ BRAILLE PATTERN DOTS-1238
bc13 Lo 밓 HANGUL SYLLABLE MIH
ffeb Sm → HALFWIDTH RIGHTWARDS ARROW
我从Anaconda的Python 3.5有unicode 8.0,我猜大多数3都会。