我有一个包含以下字符的文件:
ÇËÅÊÔÑÏÖÏÑÇÓÇÁÉÌÏÓÖÁÉÑÉÍÇÓ
我正在尝试将其转换为希腊语单词,结果应为:
ΗΛΕΚΤΡΟΦΟΡΗΣΗΑΙΜΟΣΦΑΙΡΙΝΗΣ
以上值以Unicode格式存储的文件。
我正在应用所有可能的编码,但转换时没有运气。
private void Convert()
{
string textFilePhysicalPath = (@"C:\Users\Nec\Desktop\a.txt");
string contents = File.ReadAllText(textFilePhysicalPath);
List<string> sLines = new List<string>();
// For every encoding, get the property values.
EncodingInfo ei;
foreach (var ei in Encoding.GetEncodings())
{
Encoding e = ei.GetEncoding();
Encoding iso = Encoding.GetEncoding(ei.Name);
Encoding utfx = Encoding.Unicode;
byte[] utfBytes = utfx.GetBytes(contents);
byte[] isoBytes = Encoding.Convert(utfx, iso, utfBytes);
string msg = iso.GetString(isoBytes);
string xx = (ei.Name + " " + msg);
sLines.Add(xx);
}
using (StreamWriter file = new StreamWriter(@"C:\Users\Nec\Desktop\result.txt"))
{
foreach (var line in sLines)
file.WriteLine(line);
}
}
正确转换网站的网站是http://www.online-decoder.com/el
但是即使我使用ISO-8859-1
到ISO-8859-7
,它仍然无法在.NET中使用。
答案 0 :(得分:5)
此代码使用通用的ISO-8859-1代码页将字符串从UTF-16的C#转换为8位表示形式。然后,使用希腊语代码页Windows-1253将其转换回UTF-16。结果是您想要的ΗΛΕΚΤΡΟΦΟΡΗΣΗ ΑΙΜΟΣΦΑΙΡΙΝΗΣ
。
string errorneousString = "ÇËÅÊÔÑÏÖÏÑÇÓÇ ÁÉÌÏÓÖÁÉÑÉÍÇÓ";
byte[] asIso88591Bytes = Encoding.GetEncoding("ISO-8859-1").GetBytes(errorneousString);
string asGreekString = Encoding.GetEncoding("windows-1253").GetString(asIso88591Bytes);
Console.OutputEncoding = System.Text.Encoding.UTF8;
Console.WriteLine(asGreekString);
编辑:由于文件是以8位格式编码的,因此在读取文件时需要指定代码页。使用这个:
string fileContents = File.ReadAllText("189.dat", Encoding.GetEncoding("windows-1253"));
Console.OutputEncoding = System.Text.Encoding.UTF8;
Console.WriteLine(fileContents);
将内容读取为
'CS','C.S.F。考试”,“'EΞΕΤΑΣΗΕ.Ν.Υ。'。 'EH','Hb ELECTROPHORESIS','ΗΛΕΚΤΡΟΦΟΡΗΣΗΑΙΜΟΣΦΑΙΡΙΝΗΣ''EP','蛋白质 ELECTROPHORESIS','ΗΛΕΚΤΡΟΦΟΡΗΣΗΠΡΩΤΕΙΝΩΝ''FB','血液学- FBC','ΓΕΝΙΚΗΕΞΕΤΑΣΗΑΙΜΑΤΟΣ-FBC''FR','FREE TEXT','GT','GLUCOSE 公差测试”,'ΔΟΚΙΜΑΣΙΑΑΝΟΧΗΣΓΛΥΚΟζΗΣ' 'MI','MICROBIOLOGY','ΜΙΚΡΟΒΙΟΛΟΓΙΑ''NO','NORMAL FORM','ΚΑΝΟΝΙΚΟ ΔΕΛΤΙΟ''RE','RENAL CALCULUS','ΧΗΜΙΚΗΑΝΑΛΥΣΗΟΥΡΟΛΙΘΟΥ''SE','SEMEN 分析”,“ΣΠΕΡΜΟΔΙΑΓΡΑΜΜΑ”,“ SP”,“特殊病理”,“特殊” 病理学“ ST”,“工具检查”
','ΕΞΕΤΑΣΗΚΟΠΡΑΝΩΝ''SW','SEMEN WASH','SEMEN WASH' 'TH','THROMBOPHILIA PANEL','THROMBOPHILIA PANEL''UR','URINE Analysis','ΓΕΝΙΚΗΕΞΕΤΑΣΗΟΥΡΩΝ''WA','WATER CULTURE REPORT','ΑΝΑΛΥΣΗ ΝΕΡΟΥ''WI','WIDAL','ΑΝΟΣΟΒΙΟΛΟΓΙΑ'
答案 1 :(得分:2)
这是使用希腊语(1253)代码页存储的ASCII文件,该文件使用其他代码页读取。
File.ReadAllText尝试通过检查BOM字节和falls back to UTF8 by default来检测文件是UTF16还是UTF8。 UTF8本质上是单字节文本的7位ANSI代码页,这意味着尝试像这样读取 non Unicode和 non ANSI文件会导致文本乱码。
要使用特定的编码/代码页加载文件,只需将编码作为Encoding
参数即可,例如:
var enc = Encoding.GetEncoding(1253);
var text=File.ReadAllText(@"189.dat",enc);
.NET中的字符串是Unicode,特别是UTF16。这意味着text
不需要任何转换。其内容为:
'CS','C.S.F. EXAMINATION','ΕΞΕΤΑΣΗ Ε.Ν.Υ.'
'EH','Hb ELECTROPHORESIS','ΗΛΕΚΤΡΟΦΟΡΗΣΗ ΑΙΜΟΣΦΑΙΡΙΝΗΣ'
'EP','PROTEIN ELECTROPHORESIS','ΗΛΕΚΤΡΟΦΟΡΗΣΗ ΠΡΩΤΕΙΝΩΝ'
'FB','HAEMATOLOGY - FBC','ΓΕΝΙΚΗ ΕΞΕΤΑΣΗ ΑΙΜΑΤΟΣ - FBC'
'FR','FREE TEXT',
'GT','GLUCOSE TOLERANCE TEST','ΔΟΚΙΜΑΣΙΑ ΑΝΟΧΗΣ ΓΛΥΚΟΖΗΣ'
'MI','MICROBIOLOGY','ΜΙΚΡΟΒΙΟΛΟΓΙΑ'
'NO','NORMAL FORM','ΚΑΝΟΝΙΚΟ ΔΕΛΤΙΟ'
'RE','RENAL CALCULUS','ΧΗΜΙΚΗ ΑΝΑΛΥΣΗ ΟΥΡΟΛΙΘΟΥ'
'SE','SEMEN ANALYSIS','ΣΠΕΡΜΟΔΙΑΓΡΑΜΜΑ'
'SP','SPECIAL PATHOLOGY','SPECIAL PATHOLOGY'
'ST','STOOL EXAMINATION ','ΕΞΕΤΑΣΗ ΚΟΠΡΑΝΩΝ'
'SW','SEMEN WASH','SEMEN WASH'
'TH','THROMBOPHILIA PANEL','THROMBOPHILIA PANEL'
'UR','URINE ANALYSIS','ΓΕΝΙΚΗ ΕΞΕΤΑΣΗ ΟΥΡΩΝ'
'WA','WATER CULTURE REPORT','ΑΝΑΛΥΣΗ ΝΕΡΟΥ'
'WI','WIDAL ','ΑΝΟΣΟΒΙΟΛΟΓΙΑ'
UTF16每个字符使用两个字节。如果在十六进制浏览器中打开了UTF16文件,则其他所有字符均为NUL(0x00)。它也不是UTF8-在7位ANSI范围之外的每个字符都使用两个或多个始终设置高位的字节。代替一个乱码,至少要有两个。
.NET中可能受编码或区域性影响的文件和流方法始终具有接受Encoding或CultureInfo参数的重载。
控制台
将输出写入控制台可能会以乱码显示。文本并没有真正转换,只是以错误的方式显示。
当控制台可以显示Unicode文本时,它假定默认情况下使用了系统的代码页。过去,它甚至不支持将UTF8作为代码页-设置中没有此类选项。毕竟,系统区域设置的标签是Language used for non-Unicode programs
。
最新的Windows 10 Insider版本将UTF8作为系统代码页作为beta选项提供。
要确保Unicode文本在控制台中正确显示,必须将其编码设置为UTF8,例如:
var text=File.ReadAllText(@"189.dat",enc);
Console.OutputEncoding = Encoding.UTF8;
Console.WriteLine(text);
答案 2 :(得分:0)
我不知道这是什么代码页,但似乎只是被某些值所抵消。您可以通过将第一个字节添加11并在第二个字节添加16来将源字符串转换为目标字符串:
var input = Encoding.Default.GetBytes("ÇËÅÊÔÑÏÖÏÑÇÓÇ ÁÉÌÏÓÖÁÉÑÉÍÇÓ");
for (var i = 0; i < input.Length; i++)
{
if (input[i] == 32) continue;
input[i++] += 11;
input[i] += 16;
}
var output = Encoding.UTF8.GetString(input);
结果:ΗΛΕΚΤΡΟΦΟΡΗΣΗΑΙΜΟΣΦΑΙΡΙΝΗΣ
不确定这是否是解决方案,但可能会给您提示。
答案 3 :(得分:0)
就这样 C#
HtmlWeb web = new HtmlWeb();
web.OverrideEncoding = Encoding.GetEncoding(65001);