web-dev-qa-db-ja.com

Unicode文字列をPythonの文字列に変換します(余分な記号を含みます)。

どうやってUnicode文字列(£$などの余分な文字を含む)をPython文字列に変換するのですか?

455
williamtroup
title = u"Klüft skräms inför på fédéral électoral große"
import unicodedata
unicodedata.normalize('NFKD', title).encode('ascii','ignore')
'Kluft skrams infor pa federal electoral groe'
537
Sorantis

ASCII以外の文字を変換する必要がない場合は、ASCIIにエンコードすることができます。

>>> a=u"aaaàçççñññ"
>>> type(a)
<type 'unicode'>
>>> a.encode('ascii','ignore')
'aaa'
>>> a.encode('ascii','replace')
'aaa???????'
>>>
300
Ferran
>>> text=u'abcd'
>>> str(text)
'abcd'

文字列がASCII文字のみを含む場合.

126
igco

Unicode文字列があり、これをファイルまたは他の直列化形式に書きたい場合は、最初に encode を格納可能な特定の表現にする必要があります。 UTF-16(ほとんどのUnicode文字に2バイトを使用)やUTF-8(文字に応じて1〜4バイト/コードポイント)など、一般的なUnicodeエンコーディングがいくつかあります。その文字列を特定のエンコーディングに変換するには、使える:

>>> s= u'£10'
>>> s.encode('utf8')
'\xc2\x9c10'
>>> s.encode('utf16')
'\xff\xfe\x9c\x001\x000\x00'

この生のバイト列はファイルに書き込むことができます。ただし、それを読み返すときは、そのエンコーディングが何であるかを知っている必要があり、同じエンコーディングを使用してデコードする必要があります。

ファイルに書き込むとき、 codecs モジュールを使うことによってこの手動のエンコード/デコードプロセスを取り除くことができます。したがって、すべてのUnicode文字列を UTF-8 にエンコードしたファイルを開くには、次のようにします。

import codecs
f = codecs.open('path/to/file.txt','w','utf8')
f.write(my_unicode_string)  # Stored on disk as UTF-8

これらのファイルを使用している他の人は、それらを読みたいのであれば、ファイルのエンコーディングが何であるかを理解している必要があります。読み書きをしているのがあなただけであれば問題ありません。それ以外の場合は、他のファイルを使用している人が理解できる形式で記述してください。

Python 3では、この形式のファイルアクセスがデフォルトであり、組み込みのopen関数はエンコーディングパラメータを取り、テキストモードで開かれたファイルに対しては常にUnicode文字列(Python 3のデフォルトの文字列オブジェクト)との間で変換します。

109
Brian

これが一例です。

>>> u = u'€€€'
>>> s = u.encode('utf8')
>>> s
'\xe2\x82\xac\xe2\x82\xac\xe2\x82\xac'
56

Python 3に切り替えようと思っている/準備ができている(Python 2コードとの後方互換性がないためではないかもしれません)場合は、変換を行う必要はありません。 Python 3のテキストはすべてUnicode文字列で表現されています。これは、u'<text>'構文をこれ以上使用しないことを意味します。実際には、データを表すのに使用されるバイトのストリング(エンコードされたストリングの場合もあります)もあります。

http://docs.python.org/3.1/whatsnew/3.0.html#text-vs-data-instead-of-unicode-vs-8-bit

(もちろん、現在Python 3を使用しているのであれば、問題はテキストをファイルに保存しようとしている方法に関係している可能性があります。)

5
JAB

これがコード例です

import unicodedata    
raw_text = u"here $%6757 dfgdfg"
convert_text = unicodedata.normalize('NFKD', raw_text).encode('ascii','ignore')
3