String」タグアーカイブ

PythonでUnicodeEncodeErrorとなる場合に

Pythonで端末のエンコーディング取得はgetpreferredencodingでできます。

>>> import sys
>>> locale.getpreferredencoding()
'cp932'

「あいうえお」と表示するスクリプト(sample.py)

# -*- coding: UTF-8 -*-
s = u'あいうえお'
print s

コマンドプロンプトから

> python.exe sample.py
あいうえお

出力をファイルにリダイレクト

> python.exe sample.py > sample.txt
Traceback (most recent call last):
  File "a.py", line 3, in <module>
    print s
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-4: ordinal not in range(128)

エンコーディングを取得するように修正

# -*- coding: UTF-8 -*-
import locale
encoding = locale.getpreferredencoding()
s = u'あいうえお'
print s.encode(encoding)

問題なく表示できます。

> python.exe sample.py
あいうえお

python-chardet

python-chardetを使った文字コード推定

使い方

>>> import chardet
>>> s = 'こんにちは'
>>> chardet.detect(s)
{'confidence': 0.9690625, 'encoding': 'utf-8'}
>>> s.decode(chardet.detect(s)['encoding'])
u'\u3053\u3093\u306b\u3061\u306f'

リンク

chardet · PyPI
https://pypi.org/project/chardet/

GitHub – chardet/chardet: Python 2/3 compatible character encoding detector.
https://github.com/chardet/chardet

Pythonでnkf

Pythonで文字コードが不明な文字列(例えばインターネット上のHTMLは文字コードが間違っている場合があります)はnkfを使うと簡単に取り扱うことができるみたいです。

# emerge -pv app-i18n/nkf

These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild   R    ] app-i18n/nkf-2.0.7  USE="python -perl"

USEフラグにpythonを付けているとPythonからnkfが使えます。

>>> import nkf
>>> nkf.nkf('-w', 'こんにちは').decode('utf-8')
u'\u3053\u3093\u306b\u3061\u306f'

手軽なので重宝しそうです。