Pythonで文字列をutf-8に変換する方法


192

utf-8文字をPythonサーバーに送信するブラウザーがありますが、それをクエリ文字列から取得すると、Pythonが返すエンコードはASCIIです。プレーンな文字列をutf-8に変換するにはどうすればよいですか?

注:ウェブから渡された文字列はすでにUTF-8でエンコードされています。PythonでASCIIではなくUTF-8として処理するようにしたいだけです。



より良いタイトルは、翻訳なしで文字列をユニコードに変換する方法でしょうか?
ボートコーダー

1
2018年、Python 3でASCIIデコードエラーが発生した場合"some_string".encode('utf-8').decode('utf-8')
devssh

回答:


265
>>> plain_string = "Hi!"
>>> unicode_string = u"Hi!"
>>> type(plain_string), type(unicode_string)
(<type 'str'>, <type 'unicode'>)

^これは、バイト文字列(plain_string)とUnicode文字列の違いです。

>>> s = "Hello!"
>>> u = unicode(s, "utf-8")

^ユニコードに変換し、エンコーディングを指定します。


34
、次のエラーが発生します:UnicodeDecodeError: 'utf8' codec can't decode byte 0xb0 in position 2: invalid start byteこれは私のコードです:csvReaderの行のret = []:行のelmのcline = []:unicodestr = unicode(elm、 'utf-8')cline.append(unicodestr)ret .append(cline)
Gopakumar NG

102
これはPython 3には当てはまりunicode()ません。すべての文字列はUnicodeであり、存在しません。
Noumenon 2015

これをぶつけるようなものですが、ありがとうございます。これにより、Unicodeを印刷しようとして sが発生する問題が修正されました。
智障的人

どのように変換することuに戻っstr形式(変換用uにバックs)?
Tanguy

3
このコードは、テキストに非ASCII文字が含まれていない場合にのみ機能します。文字列の単純なアクセント付き文字は失敗します。
Haroldo_OK 2018

71

上記のメソッドが機能しない場合は、utf-8に変換できない文字列の一部を無視するようにPythonに指示することもできます。

stringnamehere.decode('utf-8', 'ignore')

6
Got AttributeError: 'str' object has no attribute 'decode'
saran3h

2
@ saran3h Python 3を使用しているように思われます。その場合、Python エンコーディングの問題を処理する必要があります。エンコーディングを指定せずにドキュメントを読んでみましたか?
duhaime

Pythonはデフォルトでシステムエンコーディングを選択します。Windows 10では、utf-8とは異なるcp1252です。py 3.8でcodecs.open()を使用しているときに数時間を無駄にしました
Vishesh Mangla

21

少しやり過ぎかもしれませんが、同じファイルでasciiとunicodeを使用すると、デコードを繰り返すのが面倒になる場合があります。これを使用します。

def make_unicode(input):
    if type(input) != unicode:
        input =  input.decode('utf-8')
    return input

15

.pyファイルの先頭に次の行を追加します。

# -*- coding: utf-8 -*-

次のように、スクリプトで文字列を直接エンコードできます。

utfstr = "ボールト"

1
OPが求めることではありません。ただし、このような文字列リテラルは避けてください。Python 3(良い)でUnicode文字列を作成しますが、Python 2(悪い)でバイト文字列です。from __future__ import unicode_literals先頭に追加するか、u''プレフィックスを使用します。bytesリテラルで非ASCII文字を使用しないでください。utf-8バイトを取得するために、utf8bytes = unicode_text.encode('utf-8')必要に応じて後で行うことができます。
jfs 2015

1
@jfsでは、from __future__ import unicode_literalsASCII以外の文字を含む文字列をutf-8に変換するにはどうすればよい ですか?
Ortal Turgeman、

@OrtalTurgeman私は質問に答えていません。見て、それはコメントではなく、答えです。私のコメントは、回答のコードの問題に対処しています。Python 2で非ASCII文字のバイト文字列を作成しようとします(Python 3ではSyntaxErrorです。バイトリテラルでは禁止されています)。
jfs

13

私が正しく理解していれば、コードにutf-8でエンコードされたバイト文字列があります。

バイト文字列をユニコード文字列に変換することは、デコードと呼ばれます(ユニコード->バイト文字列はエンコードです)。

これを行うには、Unicode関数またはデコードメソッドを使用します。どちらか:

unicodestr = unicode(bytestr, encoding)
unicodestr = unicode(bytestr, "utf-8")

または:

unicodestr = bytestr.decode(encoding)
unicodestr = bytestr.decode("utf-8")


8

Python 3.6では、組み込みのunicode()メソッドはありません。文字列はデフォルトですでにユニコードとして保存されており、変換は必要ありません。例:

my_str = "\u221a25"
print(my_str)
>>> 25

3

ord()およびunichar()を使用して変換します。すべてのUnicode文字には、インデックスのような番号が関連付けられています。そのため、Pythonにはcharと彼の番号を変換するいくつかの方法があります。欠点は例です。お役に立てれば幸いです。

>>> C = 'ñ'
>>> U = C.decode('utf8')
>>> U
u'\xf1'
>>> ord(U)
241
>>> unichr(241)
u'\xf1'
>>> print unichr(241).encode('utf8')
ñ

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