Unicode文字列(£$などの追加文字を含む)をPython文字列に変換するにはどうすればよいですか?
unicode_string = u"I'm unicode string"; bytestring = unicode_string.encode('utf-8'); unicode_again = bytestring.decode('utf-8')
Unicode文字列(£$などの追加文字を含む)をPython文字列に変換するにはどうすればよいですか?
unicode_string = u"I'm unicode string"; bytestring = unicode_string.encode('utf-8'); unicode_again = bytestring.decode('utf-8')
回答:
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'
unicode
str
type(title) == unicode and type(title.encode('utf-8')) == str
。入力を破壊する必要はなく、ファイルに保存できるバイト文字列を取得します。
非ASCII文字を変換する必要がない場合は、ASCIIへのエンコードを使用できます。
>>> a=u"aaaàçççñññ"
>>> type(a)
<type 'unicode'>
>>> a.encode('ascii','ignore')
'aaa'
>>> a.encode('ascii','replace')
'aaa???????'
>>>
ignore
vs の効果を示す素晴らしいプレゼンテーションreplace
a.encode('ascii', 'xmlcharrefreplace')
与える'aaaàçççñññ'
。
type(a)
あるstr
のPython 3.6.8で、任意の持っていないencode()
方法を。
>>> 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'
このバイトの生の文字列は、ファイルに書き込むことができます。ただし、それを読み戻すときは、それがどのエンコーディングに含まれているかを理解し、同じエンコーディングを使用してデコードする必要があることに注意してください。
ファイルに書き込む場合、コーデックモジュールを使用して、この手動のエンコード/デコードプロセスを取り除くことができます。したがって、すべての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')
ファイルにUnicodeエスケープ文字列が含まれています
\"message\": \"\\u0410\\u0432\\u0442\\u043e\\u0437\\u0430\\u0446\\u0438\\u044f .....\",
私のために
f = open("56ad62-json.log", encoding="utf-8")
qq=f.readline()
print(qq)
{"log":\"message\": \"\\u0410\\u0432\\u0442\\u043e\\u0440\\u0438\\u0437\\u0430\\u0446\\u0438\\u044f \\u043f\\u043e\\u043b\\u044c\\u0437\\u043e\\u0432\\u0430\\u0442\\u0435\\u043b\\u044f\"}
(qq.encode().decode("unicode-escape").encode().decode("unicode-escape"))
# '{"log":"message": "Авторизация пользователя"}\n'
result.encode().decode('unicode-escape')
私の場合、Unicode文字を含む文字列変数があり、ここで説明したエンコード/デコードが機能しなかった場合、回答者は機能しませんでした。
ターミナルで行う場合
echo "no me llama mucho la atenci\u00f3n"
または
python3
>>> print("no me llama mucho la atenci\u00f3n")
出力は正しいです:
output: no me llama mucho la atención
しかし、この文字列変数をロードするスクリプトの操作は機能しませんでした。
これは私のケースでうまくいきました、万が一誰かを助ける場合:
string_to_convert = "no me llama mucho la atenci\u00f3n"
print(json.dumps(json.loads(r'"%s"' % string_to_convert), ensure_ascii=False))
output: no me llama mucho la atención
print type(unicode_string), repr(unicode_string)
Python 3.x:print type(unicode_string), ascii(unicode_string)
次に、質問を編集し、上記の印刷ステートメントの結果をコピーして貼り付けます。結果を再入力しないでください。また、HTMLの上部近くを調べて、次のようなものが見つかるかどうかを確認します。<meta http-equiv = "Content-Type" content = "text / html; charset = iso-8859