2012-01-26 4 views
4

ユニコードのエンコーディングを決定する方法は不思議でした。Pythonのユニコード文字列のデコード方法を決定する最良の方法は何ですか

私はこれについてどこかで読んだことが分かっていますが、可能かどうか覚えていませんが、方法があると信じたいと思います。

率直に言って、私はUTFにそれを回すしたい

...私はそれを動的に復号する際に使用したのと同じエンコーディングでそれをエンコードしたいのですが、のは、私はLatin-1エンコーディングでユニコードを持っているとしましょう-8ユニコードを使用する前に、文字を台無しにしないでください。

すなわち:

latin1_unicode = 'åäö'.decode('latin-1') 
utf8_unicode = latin.encode('latin-1').decode('utf-8') 
+0

これはPython 3であるか?それ以外の場合は、「ユニコード」とはどういう意味ですか? – cha0site

+0

バイト配列のエンコーディングを推測する方法は? –

+0

私はユニコードインスタンスを意味します。そして、いいえ、それはPython 3ではありません。コードポイントと、指定されたエンコーディングまたはその他の方法で文字を表現する方法を選択することで、Unicode文字列のエンコーディングを判断する方法を尋ねています。いずれにしても可能です。 – JayLev

答えて

1

「ユニコードのエンコーディングを決定する」、「ユニコード」でPythonのデータ型であり、場合「エンコーディング」は、元のバイトパターンを指して、あなたは、それを行うことはできませんそれは入力時に文字列を表現していました(たとえば、ファイル、データベースから読み込み、名前を付けたもの)。 Pythonの 'unicode'型(内部表現)になるまでに、文字列は行の後ろでデコードされたか、またはバイトシーケンスがシステムエンコーディングでジブにならなかったのでデコード例外がスローされました。

Shadyabhiの答えはあなたが(あなたが非常によく文字列に詰めることができた - ないPythonのUnicode文字列)ファイルからバイトを読み込むされている(共通)の場合を参照し、どのようなエンコーディングで推測する必要があります彼らは救われました。厳密に言えば、 "latin1 unicode python string"を持つことはできません:Unicode Python文字列にはエンコーディングがありません(エンコーディングは文字をバイトパターンに変換し、逆のプロセスとしてデコードするプロセスとして定義できます;デコードされた文字列はtherfore noエンコーディング - ストレージ/外部表現の目的でいくつかの方法でエンコードできます)。私のマシン上のインスタンスのために

デフォルトのエンコーディングはUTF-8、またはUTF-16、またはLATIN1は異なるものであることを起こる場合は、あなたの例では、latin1_unicodeはゴミが含まれています、ということを意味
In [35]: sys.stdin.encoding 
Out[35]: 'UTF-8' 

In [36]: a='è'.decode('UTF-8') 

In [37]: b='è'.decode('latin-1') 

In [38]: a 
Out[38]: u'\xe8' 

In [39]: b 
Out[39]: u'\xc3\xa8' 
In [41]: sys.stdout.encoding 
Out[41]: 'UTF-8' 

In [42]: print b #it's garbage 
è 

In [43]: print a #it's OK 
è 

だからあなたがしたい(も)何です:

  1. 確かめるデータソースのエンコーディング - おそらくShadyabhiのメソッド
  2. デコードデータは、上記(1)、それを保存のいずれかを使用してPythonのUnicode文字列で
  3. 元のエンコーディング(あなたのニーズに合ったものであれば)または選択した他のエンコーディングを使用してエンコードします。
+0

私はこれをすべて知っています。私は "デコード方法"を見つける方法を尋ねていました。私は、latin1でデコードされたユニコードがゴミのように見える理由を知っています。なぜなら、デフルトエンコーディングはutf-8であるからです。しかし、私は異なるエンコーディングを使用する異なるソースからユニコード文字列を取得します。だから私はそれらがどのようにデコードされたのか把握しなければならないので、ゴミのような文字列がたくさんあるわけではありません。さまざまなソースでエンコーディングを変更して動作させることもできますが、動的に動作させたいと思っています。 – JayLev

+0

Unicode文字列を取得すると、ソースエンコーディングに関する情報は存在しません**。私はあなたが "ゴミのように見える"という意味を理解していません。 Unicode文字列はUnicode文字列であり、すべての文字を正しく表します。いくつかのステップを取り戻し、**あなたが何をしたいのか正確に**歩いていくのはどうですか? –

+0

私はちょうどユニコードと異なるエンコーディングを扱う方法について最近知ったという事実を隠すことはありません。だから私は少し外に出るかもしれない。つまり、2つのデータベースがあり、何らかの理由でテキストフィールドの照合順序が異なります。したがって、ORM(SQLAlchemy)でフィールドタイプをUnicodeとして定義すると、同じテキストに対して異なる結果が得られます。だから、彼らは別々に保存されていますが、私はシステム全体を通してユニコードで作業します。だから私は、クエリのフィールドを更新するか、それらがどのようにエンコード/デコードされたかをチェックして値を修正する必要があると考えました。 – JayLev

関連する問題