質問
Pythonでは、文字列はユニコード(utf-16とutf-8の両方)および異なるエンコード(cp1251、cp1252など)のシングルバイトです。エンコーディング文字列が何であるかを確認することは可能ですか?たとえば、
time.strftime( "%b" )
は、月のテキスト名を含む文字列を返します。 MacOSで返される文字列はutf-16、英語ローカルのWindowsではasciiエンコーディングのシングルバイト、英語以外のロケールのWindowsではcp1251などのロケールのコードページでエンコードされます。そのような文字列をどのように処理できますか?
解決
文字列にはエンコード情報は保存されません。Unicodeへの変換/ Unicodeからの変換、または出力デバイスへの印刷時にエンコード情報を指定する必要があります。
import locale
lang, encoding = locale.getdefaultlocale()
mystring = u"blabla"
print mystring.encode(encoding)
UTF-8はユニコードではなく 、ユニコードのシングルバイト文字列へのエンコードです。
ベストプラクティスは、Python側のどこでもUnicodeを操作し、UTF-8などのUnicodeリバーシブルエンコーディングで文字列を保存し、ユーザー出力用にのみ派手なロケールに変換することです。
他のヒント
文字セットエンコーディングの検出は非常に複雑です。
しかし、これの本当の目的は何ですか? ユニコードにしたいだけの場合は、単に書いてください
unicode(time.strftime("%b"))
そして上記のすべてのケースで動作するはずです:
- mac os:unicode(unicode)->ユニコード
- win / eng:unicode(ascii)->ユニコード
- win / noneng:unicode(some_cp)->ローカルcpによって変換されます->ユニコード
未知のエンコーディングでかなり長い文字列がある場合、エンコーディングを推測してみることができます。 https://github.com/dcramer/chardet のUniversal Encoding Detectorを使用します。もちろんですが、時々正しいと推測されます;-)。しかし、それは非常に短い文字列ではあまり役に立ちません。