.net 如何获得csv文件的编码?

.net 如何获得csv文件的编码?,.net,csv,character-encoding,.net,Csv,Character Encoding,可能重复: 在我的系统中运行的.net程序为我提供了一个csv文件。我想知道那个文件的编码 csv文件包含é,ä,å,æ字符,但显示为�(带BOM的UTF8)。有没有可能我可以把这些字符押回原版或类似英文的字符 csv文件是由在同一台机器上运行的.net程序在同一用户下创建的,但创建文件后,我看不到原始字符 如果您看到�,当您将文件解码为UTF-8,但您看到ë½,当您将其解码为Windows-1252时,则文件实际上包含�。也就是说,它字面上包含字节0xEF 0xBF 0xBD(UTF-8表

可能重复:

在我的系统中运行的.net程序为我提供了一个csv文件。我想知道那个文件的编码

csv文件包含
é
ä
å
æ
字符,但显示为�(带BOM的UTF8)。有没有可能我可以把这些字符押回原版或类似英文的字符

csv文件是由在同一台机器上运行的.net程序在同一用户下创建的,但创建文件后,我看不到原始字符


如果您看到
,当您将文件解码为UTF-8,但您看到
ë½
,当您将其解码为Windows-1252时,则文件实际上包含
。也就是说,它字面上包含字节
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");
}

现在,当文件不是UTF-8时会出现异常,您可以尝试其他编码,或者让用户知道他的文件必须是UTF-8。

如果您看到
,当您将文件解码为UTF-8,但您看到
ë½
,当您将其解码为Windows-1252时,则文件实际上包含
。也就是说,它字面上包含字节
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");
}

现在,当文件不是UTF-8时会出现异常,您可以尝试其他编码,或者让用户知道他的文件必须是UTF-8。

我同意Esailija。似乎此数据在传输到SQL之前是单字节的

如果是SQL,问题将作为答案发布

在SQL中:

char和nchar都是单字节(ansii)

nchar和nvarchar是双字节(unicode)

如果将unicode加载到字符中,则会将其压缩到单个字节中。
我已经将unicode加载到char中,任何大于255的uncode都被转换为�.

如何测试

选择CAST('a'作为字符(1))

选择CAST('ee'作为字符(1))

请注意,这是扩展ASCII(我同意Esailija的说法。似乎在数据传输到SQL之前,它是单字节的

如果是SQL,问题将作为答案发布

在SQL中:

char和nchar都是单字节(ansii)

nchar和nvarchar是双字节(unicode)

如果将unicode加载到字符中,则会将其压缩到单个字节中。
我已经将unicode加载到char中,任何大于255的uncode都被转换为�.

如何测试

选择CAST('a'作为字符(1))

选择CAST('ee'作为字符(1))

请注意,它作为扩展ASCII(如何以及使用什么打开该文件?如果要将其转换为“安全”)工作你可以在这里找到很多关于这方面的帖子,但是你应该能够阅读它们,而不需要任何东西trick@Adriano我用记事本+++
打开了它,我看不到原始字符,但看到了上面提到的这些标记。将编码更改为ASCII,ANSI只会更改为其他垃圾字符,而不是真实字符。在十六进制编辑器中打开文件,然后查看实际保存了哪些数据而不是您的字符。@NickolayO。我现在已经在HxD hex editor中打开了该文件,é的十六进制值似乎为
EF BF BD
,ANSI编码为我提供了
ïïï½
字符,我想知道这意味着什么,我应该如何获得正确的字符?您是否检查了正确的字符UTF-8的t BOM?如何打开该文件以及使用什么打开该文件?如果要将其转换为“安全”你可以在这里找到很多关于这方面的帖子,但是你应该能够阅读它们,而不需要任何东西trick@Adriano我用记事本+++
打开了它,我看不到原始字符,但看到了上面提到的这些标记。将编码更改为ASCII,ANSI只会更改为其他垃圾字符,而不是真实字符。在十六进制编辑器中打开文件,然后查看实际保存了哪些数据而不是您的字符。@NickolayO。我现在已经在HxD hex editor中打开了该文件,é的十六进制值似乎为
EF BF BD
,ANSI编码为我提供了
ïïï½
字符,我想知道这意味着什么,我应该如何获得正确的字符?您是否检查了正确的字符UTF-8的t BOM?感谢您的回复,我正在Windows server 2003中打开该文件,并且已经导入到mssql中,在那里它表示为
。我想知道是否有方法可以恢复到原始字符或类似英语的字符,似乎最好不要尝试这种方法,对吗?@很难,无法恢复除了手动最佳猜测,即
Pok�emon
可能最初是
Pokémon
。我可以编辑它是如何发生的。感谢您的回复,我正在
windowsserver2003
中打开该文件,并已导入
mss