代码页和字符编码有什么区别?

11

我的ASP.NET应用程序导入CSV文件,这些文件通常在电子表格或记事本中保存,并要求选择'字符集',例如:ISO-8859-2Windows-1210DOS-852Unicode(UTF-8)

维基百科表示,UTF-8是一种字符编码,但Windows-1210ISO-8859-2是代码页。这些术语可以互换使用吗?

.NET可以很好地读取以UTF-8格式保存的文件。它会自动发现文件的编码吗?

4个回答

5

+1 感谢您提供的文章链接! - user180326

1

来自维基的引用:

"代码页是字符编码的另一个名称。它由描述特定语言字符集的值表组成。"

http://en.wikipedia.org/wiki/Code_page

并且:

“Windows代码页是一组字符或代码页(在其他操作系统中称为字符编码)在20世纪80年代和90年代用于Microsoft Windows系统。”


1

我认为这主要是历史遗留问题,但有一个明显的区别。代码页是一个查找表,一个特定的字节映射到一个特定的字符。不同的代码页使用不同的映射。在早期,这些映射实际上并没有执行。这就需要你还得拥有具有与代码页匹配的字形的字体。今天仍然存在问题,控制台窗口有一个代码页。

在Unicode编码中没有映射。它们只需要将32位压缩成高效的格式。不同的Unicode编码使用不同的方法来压缩位。字符始终具有固定值(Unicode术语中的代码点)。

UTF编码的文本文件应该有BOM,以允许读者自动检测编码。对于使用代码页编码的文本文件,没有这样的约定。从中获取良好的文本内容有点像赌博。这是一个应该消失的恶习 :)


尽管UTF-8、UTF-16和UTF-32是纯粹的算法,但存在像GB18030和UTF-EBCDIC这样包含映射表的Unicode编码。此外,对于UTF-8,不需要也不建议使用BOM。 - dan04
还是看起来像位编码。就像UTF-8偏爱ASCII一样。是的,BOM不是必需的,但不包括它只是极其愚蠢。关键是,如果您包括BOM,则有一个明确定义的标准。而对于代码页编码的文本,则没有标准可言。 - Hans Passant
说起来,这也突显了自然状态。使用奇怪的编码或故意省略BOM是一种“竞争优势”。 - Hans Passant
BOM 在 UTF-16 中非常有用。对于可以通过验证检测的 UTF-8 和 UTF-32,它是不必要的。 - dan04
大约有十亿中国人不太认同那个想法。“布什隐瞒了事实”是传奇。 - Hans Passant

0

.NET类(如StreamReader)默认使用UTF-8编码;它并不会自动检测。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接