Unicode文字列をPythonの文字列(追加のシンボルを含む)に変換します


504

Unicode文字列(£$などの追加文字を含む)をPython文字列に変換するにはどうすればよいですか?


2
使用しているPythonのバージョンと、Unicode文字列を呼び出していることを知る必要があります。煩わしさの原因となっている通貨記号を含む短いunicode_stringで次の操作を行います。Python 2.x: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
John Machin

3
あなたがウェブリクエストからユニコードを取得することは疑わしいです。UTF-8でエンコードされたUnicodeを取得します。

28
@lutz:「UTF-8でエンコードされたUnicode」はユニコードではないのですか?
jalf

2
コメントから異なる質問の解釈があることは明らかであるため、Unicode文字列python文字列の意味を具体的に明確にする必要があります(具体例を示すのが最良だと思います)。この質問をしてから3.5年以上経過しているのに、なぜこれを行わなかったのでしょうか。
Piotr Dobrogost 2013年

6
@jalf:エンコードされている場合。それは、もはやユニコードなどではありませんunicode_string = u"I'm unicode string"; bytestring = unicode_string.encode('utf-8'); unicode_again = bytestring.decode('utf-8')
JFS

回答:


573

見る unicodedata.normalize

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'

24
+1は質問を言葉どおりに回答します。ユニコードをファイルに保存できないという@williamtroupの問題は、別の質問に値するまったく異なる問題のように聞こえます
Mark Roddy

5
@John-その回答はOPの説明よりも前のものです。
ドミニクロジャー

10
@Mark Roddy:書かれている彼の質問は、いくつかの通貨記号を含む「Unicode文字列」(彼がそれを意味するものは何でも)を「Python文字列」(何でも...)に変換する方法です。 delete-other-non-ascii文字kludgeが彼の質問に答えますか???
John Machin

13
@JohnMachinこれは、質問に答えます。文字列をa に変換する唯一の方法は、ASCIIで表現できない文字を削除または変換することです。+1してください。unicodestr
イズカタ2013年

4
@lzkata:いいえ、そうではありません。type(title) == unicode and type(title.encode('utf-8')) == str。入力を破壊する必要はなく、ファイルに保存できるバイト文字列を取得します。
jfs

319

非ASCII文字を変換する必要がない場合は、ASCIIへのエンコードを使用できます。

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

4
素晴らしい答え。まさに私が必要としたもの。また、ignorevs の効果を示す素晴らしいプレゼンテーションreplace
ジョニーブルックス

またはa.encode('ascii', 'xmlcharrefreplace')与える'aaa&#224;&#231;&#231;&#231;&#241;&#241;&#241;'
Bob Stein

type(a)あるstrのPython 3.6.8で、任意の持っていないencode()方法を。
Ali Tou

138
>>> text=u'abcd'
>>> str(text)
'abcd'

文字列にASCII文字のみが含まれる場合。


18
これはWindowsでのみ機能します。ASCII以外の記号がある場合は壊れます。
バヌアン2013

6
文字列の内容がUnicode文字列のASCII文字だけではなく実際にUnicodeである場合、これは壊れます。これを行わないでください。至る所でランダムなUnicodeEncodeError例外が発生します。
Doug

11
この答えは私を助けました。文字列がASCIIであることがわかっていて、それを非Unicode文字列にキャストバックする必要がある場合、これは非常に便利です。
VedTopkar 2014年

113

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のデフォルトの文字列オブジェクト)との間で常に変換を行います。


58

次に例を示します。

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

1
utf8ここに示すようにユーロ記号をエンコードすると、疑問符だけが表示されるのはなぜですか?これが私のPythonバージョン2.7.13の画像です。(私はのような他のユニコードオブジェクトをエンコードできますu"Klüft"が、ユーロはエンコードできませんか?)
Red Pea

5

まあ、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を使用している場合、問題はテキストをファイルに保存しようとしている方法に関係している可能性があります。)


2
Python 3では、文字列はUnicode文字列です。それらは決してエンコードされません。:私は、次のテキスト重宝joelonsoftware.com/articles/Unicode.html

彼はそれをファイルに保存したいと考えています。あなたの答えはそれをどのように助けますか?
John Machin、

@lutz:そうです、Unicodeはエンコーディングではなく文字マップであることを忘れていました。@ジョン:現時点では、保存に関する問題を知るのに十分な情報がありません。エラーが発生していますか?エラーは発生していませんが、ファイルを外部で開くと、mojibakeが発生しますか?その情報がなければ、提供できる解決策は多すぎます。
JAB

@Cat:現在、彼が何を持っているかを知るための情報はありません。まして、彼の節約の問題は何ですか。私は彼にいくつかの事実を提供するように頼んだ-私の答えを見てください。
John Machin、

5

これがサンプルコードです

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

この答えは受け入れられた答えとどのように違うのですか?
sgauri

3

ファイルに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'

2
私が使用する場合でも機能しました:result.encode().decode('unicode-escape')
Ammad Khalid

0

私の場合、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

jsonをインポートする必要があります
pctripsesp
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.