Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Encoding 如何从错误编码中恢复文本?_Encoding_Character Encoding - Fatal编程技术网

Encoding 如何从错误编码中恢复文本?

Encoding 如何从错误编码中恢复文本?,encoding,character-encoding,Encoding,Character Encoding,我有一些从亚洲操作系统(中文和日文XPs)创建的文件 文件名是乱码的,例如: иè+¾«ÕÕØØØϼ­ 如何恢复原始文本? 我试过用c写这个# 并尝试将unicode更改为windows-1252,但没有成功将第一个参数更改为编码。Convert是源编码,在您的情况下,它不应该是中文?所以 Encoding.Convert(chinese, unicode, chineseBytes); 可能真的有用。因为,毕竟,您希望将CP-936转换为Unicode,而不是相反。我建议你甚至不要尝试使

我有一些从亚洲操作系统(中文和日文XPs)创建的文件 文件名是乱码的,例如:

иè+¾«ÕÕØØØϼ­

如何恢复原始文本? 我试过用c写这个#


并尝试将unicode更改为windows-1252,但没有成功

将第一个参数更改为
编码。Convert
是源编码,在您的情况下,它不应该是
中文
?所以

Encoding.Convert(chinese, unicode, chineseBytes);

可能真的有用。因为,毕竟,您希望将CP-936转换为Unicode,而不是相反。我建议你甚至不要尝试使用CP-1252,因为你的文本很可能不是拉丁语。

它是双重编码文本。原始文件在Windows-936中,然后一些应用程序假设文本在ISO-8869-1中,并将结果编码为UTF-8。下面是一个如何在Python中解码的示例:

>>> print 'иè+¾«Ñ¡Õä²ØºÏ¼­'.decode('utf8').encode('latin1').decode('cp936')
新歌+精选珍藏合辑
我相信你可以用C#做类似的事情

那不是你想要的。对于真正的UTF-16LE编码,“Unicode”是微软完全误导的名称。UTF-16LE在这里不起任何作用,您遇到的是一个简单的情况,936字符串被误码为1252

Windows代码页1252与ISO-8859-1类似,但不同。由于示例字符串中不包含任何在两种编码中不同的字节0x80-0x9F,因此无法判断哪个在示例字符串中,但我假设为1252,因为这是western Windows安装中的标准代码页

Encoding latin= Encoding.getEncoding(1252);
Encoding chinese= Encoding.getEncoding(936);

chinese.getChars(latin.getBytes(s));

这是一个老问题,但我只是在尝试从旧的Windows Server 2008 R2服务器迁移WordPress上载文件时遇到了同样的情况。”s的答案让我走上了正确的轨道,但我必须寻找正确的编码/解码对

使用以下C#,我找到了相关的编码/决定对:

使用系统;
使用系统文本;
公共课程
{
公共静态void Main()
{
//乱七八糟
字符串s=“2020ç«ççç…çççççççççççççççççççççççççççç;
//期望
字符串t=“2020竹慶本樂仁波切亞洲法筵-简介-2-1024x643.jpg”;
foreach(Encoding.GetEncodings()中的EncodingInfo ei){
Encoding e=ei.GetEncoding();
foreach(Encoding.GetEncodings()中的EncodingInfo ei2){
Encoding e2=ei2.GetEncoding();
var s2=e2.GetString(例如GetBytes);
if(s2==t){
var x=ei.CodePage;
Console.WriteLine($“e1={ei.DisplayName}(CP{ei.CodePage}),e2={ei2.DisplayName}(CP{ei2.CodePage})”;
控制台写入线(t);
控制台写入线(s2);
}
}
}
Console.WriteLine(“--------------”);
控制台写入线(t);
Console.WriteLine(Encoding.GetEncoding(65001).GetString(Encoding.GetEncoding(1252.GetBytes));
}
}
事实证明,在我的案例中,正确的编码/决定是:

e1=Western European (Windows) (CP 1252), e2=Unicode (UTF-8) (CP 65001)

因此,最后一行代码是正确转换的一行代码
Console.WriteLine(Encoding.GetEncoding(65001).GetString(Encoding.GetEncoding(1252).GetBytes(s))建议:UTF-8只处理粘贴的字节。无论哪种方式,这都取决于你粘贴字符串的终端的编码。我在提问之前尝试了两种组合,但都不起作用,所以我认为我发布的是正确的,因为源代码不是中文,对吗?
Encoding latin= Encoding.getEncoding(1252);
Encoding chinese= Encoding.getEncoding(936);

chinese.getChars(latin.getBytes(s));
e1=Western European (Windows) (CP 1252), e2=Unicode (UTF-8) (CP 65001)