質問

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を使用します。もちろんですが、時々正しいと推測されます;-)。しかし、それは非常に短い文字列ではあまり役に立ちません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top