Unicode文字列をPythonの文字列に変換します(余分な記号を含む)
-
05-07-2019 - |
質問
Unicode文字列(<!>#163; $などの余分な文字を含む)をPython文字列に変換するにはどうすればよいですか
解決
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'
他のヒント
非ASCII文字を変換する必要がない場合は、ASCIIへのエンコードを使用できます。
>>> a=u"aaaàçççñññ"
>>> type(a)
<type 'unicode'>
>>> a.encode('ascii','ignore')
'aaa'
>>> a.encode('ascii','replace')
'aaa???????'
>>>
>>> text=u'abcd'
>>> str(text)
'abcd'
文字列にASCII文字のみが含まれる場合。
Unicode文字列があり、これをファイルまたはその他のシリアル化された形式に書き込む場合は、まず保存できる特定の表現にエンコードする必要があります。 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のデフォルトの文字列オブジェクト)との間で常に変換しますテキストモードで。
例を次に示します。
>>> u = u'€€€'
>>> s = u.encode('utf8')
>>> s
'\xe2\x82\xac\xe2\x82\xac\xe2\x82\xac'
まあ、もしあなたが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を使用している場合、問題はテキストをファイルに保存しようとしている方法に関係している可能性があります。)
サンプルコード
import unicodedata
raw_text = u"here $%6757 dfgdfg"
convert_text = unicodedata.normalize('NFKD', raw_text).encode('ascii','ignore')
import json, ast
jdata = ast.literal_eval(json.dumps(jdata)) # Removing uni-code chars