Önsöz: İzleyiciniz çalışır mı?
Görüntüleyicinizin / düzenleyicinizin / terminalinizin (utf-8 kodlu dosyanızla etkileşimde bulunuyorsanız) dosyayı okuyabildiğinden emin olun. Bu, Windows'ta sıklıkla bir sorundur, örneğin Not Defteri.
Bir metin dosyasına Unicode metin mi yazıyorsunuz?
Python 2, kullanım open
ile ilgili io
modül (bu yerleşiği aynıdır open
Python 3):
import io
Genel olarak en iyi uygulama UTF-8
dosyalara yazmak için kullanılır (utf-8 ile bayt sırası konusunda endişelenmemiz bile gerekmez).
encoding = 'utf-8'
utf-8 en modern ve evrensel olarak kullanılabilir kodlamadır - tüm web tarayıcılarında, çoğu metin editöründe (sorunlarınız varsa ayarlarınıza bakın) ve çoğu terminalde / kabukta çalışır.
Windows'ta, utf-16le
çıktıyı Not Defteri'nde (veya başka bir sınırlı görüntüleyicide) görüntülemekle sınırlı olup olmadığınızı deneyebilirsiniz .
encoding = 'utf-16le' # sorry, Windows users... :(
Ve sadece içerik yöneticisi ile açın ve unicode karakterlerinizi yazın:
with io.open(filename, 'w', encoding=encoding) as f:
f.write(unicode_object)
Çok sayıda Unicode karakter kullanma örneği
Aşağıda, olası tüm karakterleri 3 bit genişliğe kadar (4 maks. mümkün (bunu şu adlı bir dosyaya koyun 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))
Bu işlem yaklaşık bir dakika sürer ve veri dosyasını görüntüleyebilirsiniz; dosya görüntüleyiciniz unicode görüntüleyebiliyorsa, dosyayı görürsünüz. Kategoriler hakkında bilgi burada bulunabilir . Sayımlara dayanarak, muhtemelen kendileriyle ilişkili hiçbir sembol içermeyen Cn ve Co kategorilerini hariç tutarak sonuçlarımızı iyileştirebiliriz.
$ python uni.py
Onaltılık eşleme, kategori gösterilecek , sembol (adı alamadığı sürece, muhtemelen bir kontrol karakteri) ve sembolün adını görüntüler. Örneğin
less
Unix veya Cygwin'de öneriyorum (tüm dosyayı çıktılarınıza yazdırmayın / sıkıştırmayın):
$ less unidata
örneğin Python 2 (unicode 5.2) kullanarak örneklediğim aşağıdaki satırlara benzer şekilde görüntülenecektir:
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'dan Python 3.5'in unicode 8.0'ı var, çoğu 3'ün olacağını tahmin ediyorum.