Pendahuluan: apakah pemirsa Anda akan berfungsi?
Pastikan pemirsa / editor / terminal Anda (namun Anda berinteraksi dengan file yang dikodekan utf-8 Anda) dapat membaca file tersebut. Ini sering menjadi masalah pada Windows , misalnya, Notepad.
Menulis teks Unicode ke file teks?
Dalam Python 2, gunakan open
dari io
modul (ini sama dengan builtin open
di Python 3):
import io
Praktik terbaik, secara umum, digunakan UTF-8
untuk menulis ke file (kita bahkan tidak perlu khawatir tentang byte-order dengan utf-8).
encoding = 'utf-8'
utf-8 adalah pengkodean yang paling modern dan dapat digunakan secara universal - ini bekerja di semua browser web, sebagian besar editor teks (lihat pengaturan Anda jika Anda memiliki masalah) dan sebagian besar terminal / shell.
Pada Windows, Anda dapat mencoba utf-16le
jika Anda terbatas untuk melihat output di Notepad (atau penampil terbatas lainnya).
encoding = 'utf-16le' # sorry, Windows users... :(
Dan buka saja dengan manajer konteks dan tulis karakter unicode Anda:
with io.open(filename, 'w', encoding=encoding) as f:
f.write(unicode_object)
Contoh menggunakan banyak karakter Unicode
Berikut adalah contoh yang mencoba untuk memetakan setiap karakter yang mungkin hingga tiga bit lebar (4 adalah maks, tapi itu akan menjadi agak jauh) dari representasi digital (dalam bilangan bulat) ke output cetak yang disandikan, bersama dengan namanya, jika mungkin (taruh ini di file bernama 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))
Ini akan berjalan dalam urutan sekitar satu menit, dan Anda dapat melihat file data, dan jika penampil file Anda dapat menampilkan unicode, Anda akan melihatnya. Informasi tentang kategori dapat ditemukan di sini . Berdasarkan jumlah, kami mungkin dapat meningkatkan hasil dengan mengecualikan kategori Cn dan Co, yang tidak memiliki simbol yang terkait dengannya.
$ python uni.py
Ini akan menampilkan pemetaan heksadesimal, kategori , simbol (kecuali jika tidak bisa mendapatkan nama, jadi mungkin karakter kontrol), dan nama simbol. misalnya
Saya merekomendasikan less
Unix atau Cygwin (jangan cetak / cat seluruh file ke output Anda):
$ less unidata
misalnya akan menampilkan mirip dengan baris berikut yang saya sampel darinya menggunakan 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 3.5 saya dari Anaconda memiliki unicode 8.0, saya kira kebanyakan 3 akan.