360

クライアントからUTF-8の有効な文字を受信することになっているソケットサーバーがあります。

問題は、一部のクライアント(主にハッカー)が間違った種類のデータをすべて送信していることです。

本物のクライアントは簡単に区別できますが、後で分析できるように、送信されたすべてのデータをファイルに記録しています。

œエラーの原因となるこのような文字が表示されることがありUnicodeDecodeErrorます。

これらの文字の有無にかかわらず、文字列UTF-8を作成できる必要があります。


アップデート:

私の特定のケースでは、ソケットサービスはMTAであったため、次のようなASCIIコマンドのみを受信することを期待しています。

EHLO example.com
MAIL FROM: <john.doe@example.com>
...

私はこれらすべてをJSONで記録していました。

それから、善意のないそこにいる何人かの人々は、あらゆる種類のがらくたを送ることに決めました。

そのため、私の特定のケースでは、ASCII以外の文字を削除してもまったく問題ありません。

4

10 に答える 10

395

http://docs.python.org/howto/unicode.html#the-unicode-type

str = unicode(str, errors='replace')

また

str = unicode(str, errors='ignore')

注: これにより、問題の文字が削除され(無視され)、文字列が含まれなくなります。

私にとってこれは理想的なケースです。アプリケーションで許可されていない非ASCII入力に対する保護として使用しているからです。

またはcodecs、モジュールのopenメソッドを使用して、ファイルを読み込みます。

import codecs
with codecs.open(file_name, 'r', encoding='utf-8',
                 errors='ignore') as fdata:
于 2012-09-17T23:05:11.223 に答える
129

エンジンをCからPythonに変更することで、うまくいきました。

エンジンはCです:

pd.read_csv(gdp_path, sep='\t', engine='c')

'utf-8'コーデックは位置18のバイト0x92をデコードできません:無効な開始バイト

エンジンはPythonです:

pd.read_csv(gdp_path, sep='\t', engine='python')

エラーはありません。

于 2018-02-12T17:08:35.830 に答える
76

この種の問題は、Python 3に移行したことで発生します。Python2が、ファイルエンコーディングの問題を単純にスチームローリングしているとは思いもしませんでした。

上記のどれもうまくいかなかった後、違いと解決策を見つける方法のこの素晴らしい説明を見つけました。

http://python-notes.curiousefficiency.org/en/latest/python3/text_file_processing.html

つまり、Python3をPython2とできるだけ同じように動作させるには、次のようにします。

with open(filename, encoding="latin-1") as datafile:
    # work on datafile here

ただし、記事を読んでください。すべてのソリューションに1つのサイズで対応できるわけではありません。

于 2016-06-09T10:21:19.290 に答える
35
>>> '\x9c'.decode('cp1252')
u'\u0153'
>>> print '\x9c'.decode('cp1252')
œ
于 2012-09-17T23:06:39.330 に答える
34

最初に、get_encoding_typeを使用してファイルタイプのエンコードを取得します。

import os    
from chardet import detect

# get file encoding type
def get_encoding_type(file):
    with open(file, 'rb') as f:
        rawdata = f.read()
    return detect(rawdata)['encoding']

2つ目は、次のタイプのファイルを開きます。

open(current_file, 'r', encoding = get_encoding_type, errors='ignore')
于 2019-05-31T03:21:36.787 に答える
29

私は同じ問題を抱えていUnicodeDecodeErrorて、この行でそれを解決しました。それが最善の方法かどうかはわかりませんが、私にとってはうまくいきました。

str = str.decode('unicode_escape').encode('utf-8')
于 2017-03-13T11:19:57.020 に答える
15

このソリューションは、「ñ」などのラテンアメリカのアクセントを使用する場合にうまく機能します。

追加するだけでこの問題を解決しました

df = pd.read_csv(fileName,encoding='latin1')
于 2020-06-03T18:09:43.207 に答える
7

このコードを使用してこの問題を解決しました

df = pd.read_csv(path, engine='python')
于 2020-11-03T12:00:58.150 に答える
4

誰かが同じ問題を抱えている場合に備えて。私はYouCompleteMeでvimを使用していますが、このエラーメッセージでycmdを起動できませんでした。私がしexport LC_CTYPE="en_US.UTF-8"たことは、問題がなくなったことです。

于 2014-04-10T11:26:24.183 に答える
3

ファイルに変更を加える必要があるが、ファイルのエンコーディングがわからない場合はどうすればよいですか?エンコーディングがASCII互換であることがわかっていて、ASCII部分のみを調べたり変更したりする場合は、surrogateescapeエラーハンドラを使用してファイルを開くことができます。

with open(fname, 'r', encoding="ascii", errors="surrogateescape") as f:
    data = f.read()
于 2018-03-11T12:45:14.750 に答える