Python 如何将字符集损坏的字符串恢复为unicode?

Python 如何将字符集损坏的字符串恢复为unicode?,python,perl,encoding,utf-8,character-encoding,Python,Perl,Encoding,Utf 8,Character Encoding,我有一个字符串(实际上是文件名),比如:ноñаÐÐÐна。它是联想NAS和samba配置的传统 enca报告: 通用转换格式8位;UTF-8 从ISO-8859-5双重编码为UTF-8 如何使用perl/shell/python恢复字符串(文件名)?您必须反转此过程。在Python中,您可以将Unicode值编码为Latin-1以再次获得一对一字节,因此过程如下: 从UTF-8解码为Unicode 从Unicode编码到Latin-1 再次从UTF-8解码为Unicode 编码至I

我有一个字符串(实际上是文件名),比如:ноñаÐÐÐна。它是联想NAS和samba配置的传统

enca报告: 通用转换格式8位;UTF-8 从ISO-8859-5双重编码为UTF-8


如何使用perl/shell/python恢复字符串(文件名)?

您必须反转此过程。在Python中,您可以将Unicode值编码为Latin-1以再次获得一对一字节,因此过程如下:

  • 从UTF-8解码为Unicode
  • 从Unicode编码到Latin-1
  • 再次从UTF-8解码为Unicode
  • 编码至ISO-8859-5
损坏的文本缺少无法打印的字符。如果忽略断开的字符,我会得到:

>>> 'ноÑÑажнаÑ.'.decode('utf8').encode('latin1').decode('utf8', 'ignore').encode('iso8859_5')
'\xdd\xde\xd0\xd6\xdd\xd0.'
在编码到ISO-8858-5之前打印结果,但用占位符替换断字符:

>>> print 'ноÑÑажнаÑ.'.decode('utf8').encode('latin1').decode('utf8', 'replace')
но��ажна�.

你必须改变这个过程。在Python中,您可以将Unicode值编码为Latin-1以再次获得一对一字节,因此过程如下:

  • 从UTF-8解码为Unicode
  • 从Unicode编码到Latin-1
  • 再次从UTF-8解码为Unicode
  • 编码至ISO-8859-5
损坏的文本缺少无法打印的字符。如果忽略断开的字符,我会得到:

>>> 'ноÑÑажнаÑ.'.decode('utf8').encode('latin1').decode('utf8', 'ignore').encode('iso8859_5')
'\xdd\xde\xd0\xd6\xdd\xd0.'
在编码到ISO-8858-5之前打印结果,但用占位符替换断字符:

>>> print 'ноÑÑажнаÑ.'.decode('utf8').encode('latin1').decode('utf8', 'replace')
но��ажна�.

enca-L ru break file.txt
output判断,我也遇到了类似的问题:

Universal transformation format 8 bits; UTF-8
  Surrounded by/intermixed with non-text data
  Doubly-encoded to UTF-8 from ISO-8859-5
上面的答案没有解决问题,因此我尝试了以下变化:

def decode(contents):
    u = contents.decode("utf-8")
    d = u.encode("raw_unicode_escape")
    return d.decode("cp1251")

# Can be used like:
decode(open('broken-file.txt', "b").read())

请注意,在我的案例中,
enca
提供了错误的信息:我将
ISO-8859-5
替换为
Windows-1251
,因为前者几乎不在任何地方使用。另外,使用
raw\u unicode\u escape
而不是
latin-1
,从
enca-L ru break file.txt
输出判断,我有一个非常类似的问题:

Universal transformation format 8 bits; UTF-8
  Surrounded by/intermixed with non-text data
  Doubly-encoded to UTF-8 from ISO-8859-5
上面的答案没有解决问题,因此我尝试了以下变化:

def decode(contents):
    u = contents.decode("utf-8")
    d = u.encode("raw_unicode_escape")
    return d.decode("cp1251")

# Can be used like:
decode(open('broken-file.txt', "b").read())

请注意,在我的案例中,
enca
提供了错误的信息:我将
ISO-8859-5
替换为
Windows-1251
,因为前者几乎不在任何地方使用。另外,使用了
raw\u unicode\u escape
而不是
latin-1
,我不确定这篇文章是否可以挽救,但作为一个通用的答案,有一个很棒的Python包,名为,它尝试恢复格式错误的文本,并可以解释其处理过程

基本CLI用法如下所示:

$echo“十五”字
ноÑÑажнаÑ
$echo“ноÐÐÐÐÐнÐÐ|”ftfy-e iso-8859-5
УТНУТОУ'У'УТАУТЖУТНУТАУ'
我成功地将其与其他输入一起使用,如下所示:

$echo'Juan CanÌas'| ftfy
胡安·卡尼亚斯
使用Python API,您可以获得解释并处理它们:

>>ftfy.fix_和_explain('Juan CanÌas'))
ExplainedText(text='Juan Cañas',explainement=[('encode','sloppy-windows-1252'),('decode','utf-8'),('normalize','NFC'))

我不确定该文本是否可以挽救,但作为一般性的回答,有一个很棒的Python包,名为,它尝试恢复格式错误的文本,并可以解释其处理过程

基本CLI用法如下所示:

$echo“十五”字
ноÑÑажнаÑ
$echo“ноÐÐÐÐÐнÐÐ|”ftfy-e iso-8859-5
УТНУТОУ'У'УТАУТЖУТНУТАУ'
我成功地将其与其他输入一起使用,如下所示:

$echo'Juan CanÌas'| ftfy
胡安·卡尼亚斯
使用Python API,您可以获得解释并处理它们:

>>ftfy.fix_和_explain('Juan CanÌas'))
ExplainedText(text='Juan Cañas',explainement=[('encode','sloppy-windows-1252'),('decode','utf-8'),('normalize','NFC'))

您给我们的字符串已经无法修复了。但是你可以从UTF-8解码,编码到拉丁语-1,从UTF-8解码,编码到ISO-8850-5。您为我们准备好原始字符串了吗?我可以访问
ажаааааа?
,它几乎就在那里,但问号表示缺少/损坏的UTF-8字节序列。我可以从文件系统读取文件名,但是o have:UnicodeDecodeError:'utf8'编解码器无法解码位置0中的字节0xc3:意外的数据结尾您给我们的字符串已经无法修复。但是你可以从UTF-8解码,编码到拉丁语-1,从UTF-8解码,编码到ISO-8850-5。您有原始字符串吗?我可以访问
ажаааа?
,它几乎就在那里,但问号表示缺少/损坏的UTF-8字节序列。我可以从文件系统读取文件名,但o有:UnicodeDecodeError:“utf8”编解码器无法解码位置0处的字节0xc3:数据意外结束谢谢。它在50%的情况下工作,在其他50%的情况下,我有:UnicodeDecodeError:“utf8”编解码器无法解码位置0处的字节0xc3:data@AndriiPetrenko:在这种情况下,您的字符串似乎无法修复。@安德烈·伊佩特伦科:您能粘贴
打印报告()吗
请改为输出这些失败的文件?@AndriiPetrenko:如果我忽略解码和编码错误(
“忽略”作为第二个参数),我得到值
S01E01(АаNаNаNаN,СбNбN,СаNзN,ззб)。你能告诉我我们现在缺少什么吗?@AndriiPetrenko:原版文件名会很有帮助,因为这会给我们一个线索,说明原版文件中缺少哪些值可能会导致这种情况。谢谢。它在50%的情况下工作,在其他50%的情况下,我有:UnicodeDecodeError:“utf8”编解码器无法解码位置0处的字节0xc3:data@AndriiPetrenko:在这种情况下,您的字符串似乎无法修复。@安德烈·伊佩特伦科:您能粘贴
打印报告()吗
请改为输出这些失败的文件?@AndriiPetrenko:如果我忽略decodi