Python 如何将字符集损坏的字符串恢复为unicode?
我有一个字符串(实际上是文件名),比如:ноñаÐÐÐна。它是联想NAS和samba配置的传统 enca报告: 通用转换格式8位;UTF-8 从ISO-8859-5双重编码为UTF-8Python 如何将字符集损坏的字符串恢复为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
如何使用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