0

Python では、文字列はユニコード ( utf-16 と utf-8 の両方) と、異なるエンコーディングのシングルバイト ( cp1251、cp1252 など) の場合があります。エンコーディング文字列が何であるかを確認することは可能ですか? 例えば、

time.strftime( "%b" )

月のテキスト名を含む文字列を返します。MacOS では返される文字列は utf-16 になり、英語ローカルの Windows では ascii エンコーディングで 1 バイトになり、英語以外のロケールの Windows では、cp1251 などのロケールのコードページでエンコードされます。そのような文字列をどのように処理できますか?

4

3 に答える 3

5

文字列にはエンコード情報は格納されません。Unicodeとの間で変換するとき、または出力デバイスに出力するときに、エンコード情報を指定する必要があります。

import locale
lang, encoding = locale.getdefaultlocale()
mystring = u"blabla"
print mystring.encode(encoding)

UTF-8はUnicodeではなく、Unicodeを1バイトの文字列にエンコードしたものです。

ベストプラクティスは、Python側のあらゆる場所でUnicodeを使用し、UTF-8などのUnicodeリバーシブルエンコーディングを使用して文字列を保存し、ユーザー出力専用のファンシーロケールに変換することです。

于 2009-05-01T10:19:15.273 に答える
1

不明なエンコーディングでかなり長い文字列がある場合は、たとえばhttps://github.com/dcramer/chardetのUniversal Encoding Detectorを使用して、エンコーディングを推測することができます。もちろん、絶対確実ではありませんが、正しく推測される場合があります。 ;-)。しかし、それは非常に短い文字列ではあまり役に立ちません。

于 2009-05-01T15:26:23.193 に答える
1

文字セット エンコーディングの検出は非常に複雑です。

しかし、これに対するあなたの本当の目的は何ですか?値を Unicode にするだけの場合は、次のように記述します。

unicode(time.strftime("%b"))

上記のすべてのケースで機能するはずです。

  • Mac OS: ユニコード(ユニコード) -> ユニコード
  • win/eng: unicode(ascii) -> unicode
  • win/noneng: unicode(some_cp) -> ローカル cp によって変換されます -> unicode
于 2009-05-01T09:43:31.677 に答える