低级字符编码如何工作?

时间:2011-05-22 23:55:11

标签: character-encoding

让我们说,我有一个名为sometext.txt的文本文件 它有一条线 - “Sic semper tyrannis”这是(如果我错了,请纠正我。)

83 105 99 32 115 101 109 112 101 114 32 116 121
114 97 110 110 105 115

(十进制ASCII)

当我使用标准库文件i / o例程从文件中读取此行时,我不执行任何字符编码工作..(或者我做??)

问题是: 哪个软件组件实际上将0和1转换为字符(即包含将0和1转换为字符的算法)?是OS组件吗?哪一个?

5 个答案:

答案 0 :(得分:4)

all 是一堆1和0。

ASCII“A”只是当“遇到”值(01000001b,或0x41或65 dec)时显示的字母(当然取决于上下文)。没有“转换”;它只是accepted mapping定义的同一事物的不同视图。


Unicode(和其他多字节)字符集通常使用不同的编码;例如,在UTF-8(Unicode编码)中,单个Unicode字符可以映射为1,2,3或4个字节,具体取决于字符。 Unicode编码转换通常发生在作为语言或运行时的一部分的IO库中;但是,支持Unicode的操作系统还需要了解Unicode编码本身(在系统调用中),因此该行可能会模糊。

UTF-8具有良好的属性,所有普通的ASCII字符都映射到单个字节,这使得它与传统的ASCII编码最兼容。

答案 1 :(得分:4)

首先,我建议您阅读The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)


  

当我从文件中读取此行时使用   标准库文件i / o例程,i   不执行任何字符编码   工作..(或者我??)

这在很大程度上取决于你所指的标准库。

在C中,当你写:

FILE* f = fopen("filename.txt", "w");
fputs("Sic semper tyrannis", f);

不执行编码转换;字符串中的char只是按原样写入文件(换行符除外)。 (当您编辑源文件时,编码 相关。)

但是在Python 3.x中,当你写:

f = open('filename.txt', 'w', encoding='UTF-8')
f.write('Sic semper tyrannis')

write函数执行从Python str类型的UTF-16/32编码到磁盘上使用的UTF-8编码的内部转换。


  

问题是:哪个软件   组件实际上转换为0和1   字符(即包含   用于转换0和1的算法   成人物)?? ??是操作系统吗?   零件??哪一个?

适当字符编码的解码功能(如MultiByteToWideCharbytes.decode)将字节转换为Unicode 代码点,这是整数唯一识别字符的。 字体将代码点转换为字形,即屏幕或纸张上显示的字符的图像。

答案 2 :(得分:1)

  

哪个软件组件实际上将0和1转换为字符(即包含将0和1转换为字符的算法)?

这取决于你使用的语言。例如,Python具有字符编码功能:

>>> f = open( ...., 'rb')
>>> data = f.read()
>>> data.decode('utf-8')
u'café'

这里,Python已将字节序列转换为Unicode字符串。确切的组件通常是用户空间中的库或程序,但是一些编译器需要知道字符编码。

在下面,它是 all 一个字节序列,即1和0。但是,给定一个字节序列,哪些字符代表? ASCII就是这样一种“字符编码”,它告诉我们如何编码或解码A-Z,a-z等等。还有很多其他,特别是UTF-8(Unicode的编码)。最后,如果你正在处理文本,你需要知道它编码的字符编码。

答案 3 :(得分:1)

没有(好吧,没有那么多)用0和1做。大多数字符编码使用8位的整个字节。您编写的每个数字代表一个字节。在ASCII中,每个字符都是一个字节。除此之外,ASCII是ANSI和UTF-8的子集,使其与最常用的字符集兼容。 ASCII仅包含字节范围的前半部分。 Chars高达127。

对于ANSI,您需要一些编码。 ANSI指定字节范围的上半部分中的字符。在UTF-8中,这些ANSI字符不存在。相反,这最后128个字节代表一部分字符。整个字符由2到4个字节组成。除了那些128个ASCII字符。它们仍然是旧的单字节字符。我认为这主要是因为如果UTF-8与ASCII兼容,那么美国人就不会采用它。 ; - )

但是,操作系统确实有各种功能来处理字符编码。它们取决于操作系统和平台,但如果我正确地阅读了您的问题,那么您并不是真的在寻找某些特定的API。你的问题无法回答具体问题。有许多方法可以处理字符,这是处理实际字符数据和将它们写入屏幕之间的主要区别。 (字符和字体之间的区别)。

答案 4 :(得分:1)

就像DrStrangeLove所说,它是1& 0到你的显示屏幕以及更远的地方 - 'A'字符是一个像素数组,其颜色/亮度由显示驱动程序中的位定义。将像素阵列转变为可理解的角色需要生物电子化学摄像机连接到10 ^ 11门限逻辑门,运行自适应大规模并行操作系统和无人理解的应用程序,尤其是在几瓶啤酒之后

不完全确定你在问什么。文件中的0和1被磁盘驱动程序阻塞为可以表示ASCII代码的字节 - 它只能读/写8位的块。显示驱动程序使用所选字体将ASCII代码字节渲染为可显示的位图。

RGDS, 马丁