序文:ビューアは機能しますか?
ビューア/エディタ/ターミナル(utf-8でエンコードされたファイルを操作している場合でも)がファイルを読み取れることを確認してください。これは、メモ帳などのWindowsでよく発生する問題です。
Unicodeテキストをテキストファイルに書き込みますか?
Python 2ではopen
、io
モジュールから使用します(これはopen
Python 3の組み込みと同じです):
import io
一般的に、UTF-8
ファイルへの書き込みにはベストプラクティスを使用します(utf-8を使用してバイト順を気にする必要もありません)。
encoding = 'utf-8'
utf-8は最もモダンで普遍的に使用できるエンコーディングです。すべてのWebブラウザー、ほとんどのテキストエディター(問題がある場合は設定を参照)、ほとんどのターミナル/シェルで動作します。
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))
これは約1分程度で実行され、データファイルを表示できます。ファイルビューアでUnicodeを表示できる場合は、Unicodeが表示されます。カテゴリーについての情報はここにあります。カウントに基づいて、シンボルが関連付けられていないCnおよびCoカテゴリを除外することで、結果を改善できると考えられます。
$ python uni.py
16進数のマッピング、カテゴリ、シンボル(名前を取得できない場合は、おそらく制御文字)、およびシンボルの名前が表示されます。例えば
私less
はUnixまたはCygwin をお勧めします(出力全体にファイル全体を出力または出力しないでください)。
$ 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がそうだと思います。