我的ASP.NET应用程序导入CSV文件,这些文件通常在电子表格或记事本中保存,并要求选择'字符集',例如:ISO-8859-2
、Windows-1210
、DOS-852
或Unicode(UTF-8)
。
维基百科表示,UTF-8
是一种字符编码,但Windows-1210
和ISO-8859-2
是代码页。这些术语可以互换使用吗?
.NET可以很好地读取以UTF-8格式保存的文件。它会自动发现文件的编码吗?
我的ASP.NET应用程序导入CSV文件,这些文件通常在电子表格或记事本中保存,并要求选择'字符集',例如:ISO-8859-2
、Windows-1210
、DOS-852
或Unicode(UTF-8)
。
维基百科表示,UTF-8
是一种字符编码,但Windows-1210
和ISO-8859-2
是代码页。这些术语可以互换使用吗?
.NET可以很好地读取以UTF-8格式保存的文件。它会自动发现文件的编码吗?
来自维基的引用:
"代码页是字符编码的另一个名称。它由描述特定语言字符集的值表组成。"
http://en.wikipedia.org/wiki/Code_page
并且:
“Windows代码页是一组字符或代码页(在其他操作系统中称为字符编码)在20世纪80年代和90年代用于Microsoft Windows系统。”
我认为这主要是历史遗留问题,但有一个明显的区别。代码页是一个查找表,一个特定的字节映射到一个特定的字符。不同的代码页使用不同的映射。在早期,这些映射实际上并没有执行。这就需要你还得拥有具有与代码页匹配的字形的字体。今天仍然存在问题,控制台窗口有一个代码页。
在Unicode编码中没有映射。它们只需要将32位压缩成高效的格式。不同的Unicode编码使用不同的方法来压缩位。字符始终具有固定值(Unicode术语中的代码点)。
UTF编码的文本文件应该有BOM,以允许读者自动检测编码。对于使用代码页编码的文本文件,没有这样的约定。从中获取良好的文本内容有点像赌博。这是一个应该消失的恶习 :)
.NET类(如StreamReader)默认使用UTF-8编码;它并不会自动检测。