Lời nói đầu: người xem của bạn sẽ làm việc?
Đảm bảo trình xem / trình chỉnh sửa / thiết bị đầu cuối của bạn (tuy nhiên bạn đang tương tác với tệp được mã hóa utf-8) có thể đọc tệp. Đây thường là một vấn đề trên Windows , ví dụ, Notepad.
Viết văn bản Unicode vào một tệp văn bản?
Trong Python 2, sử dụng open
từ io
mô-đun (điều này giống với nội dung open
trong Python 3):
import io
Nói chung, cách tốt nhất là sử dụng UTF-8
để ghi vào tệp (chúng ta thậm chí không phải lo lắng về thứ tự byte với utf-8).
encoding = 'utf-8'
utf-8 là mã hóa hiện đại và có thể sử dụng phổ biến nhất - nó hoạt động trong tất cả các trình duyệt web, hầu hết các trình soạn thảo văn bản (xem cài đặt của bạn nếu bạn gặp sự cố) và hầu hết các thiết bị đầu cuối / shell.
Trên Windows, bạn có thể thử utf-16le
nếu bạn bị giới hạn xem đầu ra trong Notepad (hoặc một trình xem giới hạn khác).
encoding = 'utf-16le' # sorry, Windows users... :(
Và chỉ cần mở nó với trình quản lý bối cảnh và viết các ký tự unicode của bạn ra:
with io.open(filename, 'w', encoding=encoding) as f:
f.write(unicode_object)
Ví dụ sử dụng nhiều ký tự Unicode
Đây là một ví dụ cố gắng ánh xạ mọi ký tự có thể rộng tới ba bit (4 là tối đa, nhưng sẽ đi hơi xa) từ biểu diễn kỹ thuật số (theo số nguyên) sang đầu ra có thể in được mã hóa, cùng với tên của nó, nếu có thể (đặt cái này vào một tập tin gọi là 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))
Điều này sẽ chạy theo thứ tự khoảng một phút và bạn có thể xem tệp dữ liệu và nếu trình xem tệp của bạn có thể hiển thị unicode, bạn sẽ thấy nó. Thông tin về các loại có thể được tìm thấy ở đây . Dựa trên số lượng, có lẽ chúng tôi có thể cải thiện kết quả của mình bằng cách loại trừ các danh mục Cn và Co, không có biểu tượng liên quan đến chúng.
$ python uni.py
Nó sẽ hiển thị ánh xạ thập lục phân, danh mục , ký hiệu (trừ khi không thể lấy tên, vì vậy có thể là ký tự điều khiển) và tên của biểu tượng. ví dụ
Tôi khuyên dùng less
trên Unix hoặc Cygwin (không in / cat toàn bộ tệp cho đầu ra của bạn):
$ less unidata
ví dụ: sẽ hiển thị tương tự như các dòng sau mà tôi đã lấy mẫu từ nó bằng 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
Python Python 3.5 của tôi từ Anaconda có unicode 8.0, tôi đoán là hầu hết 3 sẽ.