.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