tou*_*ugh 1 .net csv character-encoding
可能重复:
使用BULK INSERT未正确导入重音字符
在我的系统中运行的.net程序为我提供了一个csv文件.我想知道该文件的编码.
csv文件具有é
,ä
,å
,æ
的字符,但被示出为(UTF8-与BOM).我是否有可能将这些角色押注为原始角色或英文角色.
csv文件是由在同一用户下同一台机器上运行的.net程序创建的,但在创建文件后我看不到原始字符.
sample data (UTF8-Without BOM) from csv file.
Pok?mon Black Version
TGC ? Nintendo
on H?tel de R?ve
La Reine Masqu?e et la Tour des Miroirs
Run Code Online (Sandbox Code Playgroud)
如果您看到?
,当您将文件解码为UTF-8时,但是您看到�
,当您将其解码为Windows-1252时,该文件确实包含?
.IE它实际上包含字节0xEF 0xBF 0xBD
(UTF-8 ?
).因此,此时数据无法恢复.
当某些字节流的物理编码与用于解码它的编码不匹配时,会发生这种情况.因此,例如,物理编码是Windows-1252,然后程序使用带有替换回退的UTF-8将其解码为内部字符串.现在,字符串内部包含?
,但它没有被检查,并以UTF-8的形式写入文件,结果文件就是你拥有的.
为避免最初的搞砸,最好在解码文件时使用异常回退而不是替换回退,例如:
Encoding enc = Encoding.GetEncoding(
"UTF-8",
new EncoderExceptionFallback(),
new DecoderExceptionFallback()
);
try
{
File.ReadAllText(@"myfile.csv", enc);
}
catch (DecoderFallbackException e)
{
Console.WriteLine("This file was not encoded in UTF-8, try some other encoding");
}
Run Code Online (Sandbox Code Playgroud)
现在,当文件不是UTF-8时会出现异常,您可以尝试其他编码或让用户知道他的文件必须是UTF-8.