0

ユニコードのリストがあります

lst = [u'\xd0\xbe', u'/', u'\xd0\xb8', u'\xd1\x81', u'\xd0\xb2', u'\xd0\xba', u'\xd1\x8f', u'\xd1\x83', u'\xd0\xbd\xd0\xb0', u'____', u'|', u'\xd0\xbf\xd0\xbe', u'11', u'search', u'\xd0\xbe\xd1\x82', u'**modis**', u'15', u'\xd0\xa1', u'**avito**', u'\xd0\xbd\xd0\xb5', u'[\xd0\xa1\xd0\xbe\xd1\x85\xd1\x80\xd0\xb0\xd0\xbd\xd1\x91\xd0\xbd\xd0\xbd\xd0\xb0\xd1\x8f', u'\xd0\x92', u'\xd0\xb5\xd1\x89\xd1\x91', u'kid', u'google', u'\xd0\xbb\xd0\xb8', u'13', u'**\xd0\xb0\xd0\xb2\xd0\xb8\xd1\x82\xd0\xbe**', u'[\xd0\x9f\xd0\xbe\xd0\xba\xd0\xb0\xd0\xb7\xd0\xb0\xd1\x82\xd1\x8c', u'\xd0\x9f\xd0\xbe\xd0\xb6\xd0\xb0\xd0\xbb\xd0\xbe\xd0\xb2\xd0\xb0\xd1\x82\xd1\x8c\xd1\x81\xd1\x8f', u'\xd0\x9e', u'&parent-', u'\xd0\xaf\xd0\xbd\xd0\xb4\xd0\xb5\xd0\xba\xd1\x81', u'###', u'**avito**.', u'**kiddieland**', u'\xd0\xbc\xd0\xb0\xd0\xb3\xd0\xb0\xd0\xb7\xd0\xb8\xd0\xbd', u'45', u'click2.yandex.ru/redir', u'72']

u'\xd0\xbe'私はいくつかのようなものをロシア語に変換しようとしています。2 と 3 の python を使用しようとしましたが、それはできません。私はIDE Pycharmを使用しており、設定にはデフォルトのutf-8があります。それを印刷すると

for elem in lst:
    print (elem)

それは最初の要素のために私を返しますо。試しprint (elem.encode('cp1252')) てみると返ってきますb'\xd0\xbe' 使っchardet.detectてみると返ってきますutf-8。どうすればそれをロシア語のアルファベットに変換できますか、そしてなぜ私が使用する方法がそれを取得するのに適していないのか、誰か説明してもらえますか.

4

2 に答える 2

1

あなたのリストの要素はUTF-8でエンコードされたバイト文字列のようですが、それらはタイプstr(またはunicodePython 2)です。

以下を使用して、それらを適切な UTF-8 に変換し直しました。

def reinterpret(string):
    byte_arr = bytearray(ord(char) for char in string)
    return byte_arr.decode('utf8')

これにより、次のようになります。これは、ロシア語に少し似ています。

>>> for elem in lst:
...     print(reinterpret(elem))
... 
о
/
и
с
в
к
я
у
на
____
|
по
11
search
от
**modis**
15
С
**avito**
не
[Сохранённая
В
ещё
kid
google
ли
13
**авито**
[Показать
Пожаловаться
О
&parent-
Яндекс
###
**avito**.
**kiddieland**
магазин
45
click2.yandex.ru/redir
72
于 2016-10-12T15:54:04.250 に答える
1

データはMojibakeであり、UTF-8 バイトから Latin-1 または CP1252 として誤ってデコードされています。

そのプロセスを手動で元に戻すことで、これを修復できます。

repaired = [elem.encode('latin1').decode('utf8') for elem in lst]

でも気をつけて。データが実際に cp1252 としてデコードされた場合、ソース データに 0x80 ~ 0x9f の範囲にバイトがあると、上記は失敗します。

代わりにftfyライブラリを使用できます。強制デコードも処理できる専門のコーデックが含まれています (バイトは、CP1252 マッピングが欠落している Latin-1 として選択的にデコードされます)。

import ftfy

repaired = [ftfy.fix_text(elem) for elem in lst]

ftfy.fix_text()データがデコードされたコーデックを自動検出するのに適しています。

どちらの方法も、指定したサンプル データに対して機能します。その特定の例では、使用ftfyまたは手動でデコードしても違いはありません。

>>> import ftfy
>>> repaired = [ftfy.fix_text(elem) for elem in lst]
>>> repaired
[u'\u043e', u'/', u'\u0438', u'\u0441', u'\u0432', u'\u043a', u'\u044f', u'\u0443', u'\u043d\u0430', u'____', u'|', u'\u043f\u043e', u'11', u'search', u'\u043e\u0442', u'**modis**', u'15', u'\u0421', u'**avito**', u'\u043d\u0435', u'[\u0421\u043e\u0445\u0440\u0430\u043d\u0451\u043d\u043d\u0430\u044f', u'\u0412', u'\u0435\u0449\u0451', u'kid', u'google', u'\u043b\u0438', u'13', u'**\u0430\u0432\u0438\u0442\u043e**', u'[\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c', u'\u041f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c\u0441\u044f', u'\u041e', u'&parent-', u'\u042f\u043d\u0434\u0435\u043a\u0441', u'###', u'**avito**.', u'**kiddieland**', u'\u043c\u0430\u0433\u0430\u0437\u0438\u043d', u'45', u'click2.yandex.ru/redir', u'72']
>>> print repaired[20]
[Сохранённая

もちろん、最初からモジバケを作成しない方が良い解決策です。エラーの原因を修正できれば、なおさらです。

たとえば、requestsライブラリを使用してこのデータをロードし、属性を安全に使用できると想定した場合は、ライブラリ ドキュメントの高度な使用方法の章のエンコーディングセクションをおresponse.text読みください。

リクエストがこれを行わないのは、HTTP ヘッダーに明示的な文字セットが存在せず、Content-Type ヘッダーにテキストが含まれている場合のみです。この場合、RFC 2616 は、デフォルトの文字セットが ISO-8859-1 でなければならないと指定しています。この場合、リクエストは仕様に従います。別のエンコーディングが必要な場合は、Response.encodingプロパティを手動で設定するか、 raw を使用できますResponse.content

そのため、応答に文字セットが定義されている場合は、response.text代わりに Latin-1 でデコードされたテキストが返されます。その場合は使用を避けて代わりにresponse.text使用response.contentし、手動でデコードするか、フォーマットに適したパーサーを使用して、使用されているコーデック (HTML 用の BeautifulSoup など) を決定することをお勧めします。

于 2016-10-12T15:54:05.400 に答える