簡體   English   中英

如何識別不正確編碼的字符串python?

[英]How to identify improperly encoded string python?

我有以下字符串

my_str = 'ґрµ р рѕр рґр сџ сѓрµр сњсѓрєрѕс рґрµсџс сњрѕрѕсѓс рїрѕ с рѕс рїсђрѕрёр сџ рјсѓс рґр сџ рер рµрѕрёсџ рєрѕсђрјрѕрі'

這個字符串的編碼不正確,這是顯而易見的。 但是有沒有辦法自動檢測到這一點?

這不是mojibake 我試過

from ftfy.badness import badness
badness(my_str)

返回 0,這意味着這不是 mojibake。 我也試過

ftfy.fix_text(my_str)

它返回原始字符串my_str

如果我嘗試對其進行編碼而不是編碼

my_str.encode('utf-8').decode('latin-1')

結果是:

Ò\x91Ñ\x80µ Ñ\x80 Ñ\x80Ñ\x95Ñ\x80 Ñ\x80Ò\x91Ñ\x80 Ñ\x81Ñ\x9f Ñ\x81Ñ\x93Ñ\x80µÑ\x80 Ñ\x81Ñ\x9aÑ\x81Ñ\x93Ñ\x80Ñ\x94Ñ\x80Ñ\x95Ñ\x81 Ñ\x80Ò\x91Ñ\x80µÑ\x81Ñ\x9fÑ\x81 Ñ\x81Ñ\x9aÑ\x80Ñ\x95Ñ\x80Ñ\x95Ñ\x81Ñ\x93Ñ\x81 Ñ\x80Ñ\x97Ñ\x80Ñ\x95 Ñ\x81 Ñ\x80Ñ\x95Ñ\x81 Ñ\x80Ñ\x97Ñ\x81Ñ\x92Ñ\x80Ñ\x95Ñ\x80Ñ\x91Ñ\x80 Ñ\x81Ñ\x9f Ñ\x80Ñ\x98Ñ\x81Ñ\x93Ñ\x81 Ñ\x80Ò\x91Ñ\x80 Ñ\x81Ñ\x9f Ñ\x80еÑ\x80 Ñ\x80µÑ\x80Ñ\x95Ñ\x80Ñ\x91Ñ\x81Ñ\x9f Ñ\x80Ñ\x94Ñ\x80Ñ\x95Ñ\x81Ñ\x92Ñ\x80Ñ\x98Ñ\x80Ñ\x95Ñ\x80Ñ\x96

或者

my_str.encode('utf-8').decode('latin-1')

返回

Ò\x91Ñ\x80µ Ñ\x80 Ñ\x80Ñ\x95Ñ\x80 Ñ\x80Ò\x91Ñ\x80 Ñ\x81Ñ\x9f Ñ\x81Ñ\x93Ñ\x80µÑ\x80 Ñ\x81Ñ\x9aÑ\x81Ñ\x93Ñ\x80Ñ\x94Ñ\x80Ñ\x95Ñ\x81 Ñ\x80Ò\x91Ñ\x80µÑ\x81Ñ\x9fÑ\x81 Ñ\x81Ñ\x9aÑ\x80Ñ\x95Ñ\x80Ñ\x95Ñ\x81Ñ\x93Ñ\x81 Ñ\x80Ñ\x97Ñ\x80Ñ\x95 Ñ\x81 Ñ\x80Ñ\x95Ñ\x81 Ñ\x80Ñ\x97Ñ\x81Ñ\x92Ñ\x80Ñ\x95Ñ\x80Ñ\x91Ñ\x80 Ñ\x81Ñ\x9f Ñ\x80Ñ\x98Ñ\x81Ñ\x93Ñ\x81 Ñ\x80Ò\x91Ñ\x80 Ñ\x81Ñ\x9f Ñ\x80еÑ\x80 Ñ\x80µÑ\x80Ñ\x95Ñ\x80Ñ\x91Ñ\x81Ñ\x9f Ñ\x80Ñ\x94Ñ\x80Ñ\x95Ñ\x81Ñ\x92Ñ\x80Ñ\x98Ñ\x80Ñ\x95Ñ\x80Ñ\x96

或者

my_str.encode('utf-8').decode('Windows-1254')

我有

UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 25: character maps to <undefined>

我的問題是我不知道原始編碼,在這種情況下,這是一些俄語字符串,可能是已編碼為 UTF-8 的 Windows-1254。 我正在尋找類似的東西

def bad_encoding(str_) -> bool:
     return True if string has been encoded bad else False 

沒有正確的方法來識別字符串的確切編碼。 您可以檢查最常見的函數並使用 try/exception 構建布爾函數。

def bad_encoding(text):
try:
    text = text.encode('cp1252').decode('utf-8')
    return False
except (UnicodeEncodeError, UnicodeDecodeError):
    try:
        text = text.encode('cp1252').decode(
            'latin-1').encode('utf-8').decode('utf-8')
        return False
    except UnicodeEncodeError:
        return True

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM