JavaRush /Java 博客 /Random-ZH /文本编码 ASCII (Windows 1251, CP866, KOI8-R) 和 Unicode (UTF 8...
articles
第 15 级

文本编码 ASCII (Windows 1251, CP866, KOI8-R) 和 Unicode (UTF 8, 16, 32) - 如何用破解者解决问题

已在 Random-ZH 群组中发布
今天我们将讨论 krakozyabrs 在网站和程序中的来源、存在哪些文本编码以及应该使用哪些文本编码。让我们仔细看看它们的发展历史,从基本的 ASCII 开始,及其扩展版本 CP866、KOI8-R、Windows 1251,最后到现代 Unicode 联盟编码 UTF 16 和 8。 目录 文本编码 ASCII (Windows 1251, CP866, KOI8-R) 和 Unicode (UTF 8, 16, 32) - 如何用破解者解决问题 - 1对于某些人来说,这些信息可能看起来没有必要,但是您知道我收到了多少专门关于爬行 krakozyabrs(不可读的字符集)的问题。现在有机会请大家参考这篇文章的文字,找出自己的错误。好吧,准备好吸收信息并尝试遵循故事的流程。

ASCII - 拉丁字母的基本文本编码

文本编码的发展与IT行业的形成同时发生,在此期间它们经历了相当多的变化。从历史上看,这一切都始于 EBCDIC,它的俄语发音相当不和谐,它使得用控制字符对拉丁字母、阿拉伯数字和标点符号进行编码成为可能。但是,现代文本编码发展的起点应该被认为是著名的ASCII(美国信息交换标准代码,在俄语中通常发音为“ask”)。它描述了英语用户最常用的前 128 个字符 - 拉丁字母、阿拉伯数字和标点符号。这 128 个用 ASCII 描述的字符还包括一些服务字符,如括号、井号、星号等。事实上,你可以自己看到它们: 文本编码 ASCII (Windows 1251, CP866, KOI8-R) 和 Unicode (UTF 8, 16, 32) - 如何用破解者解决问题 - 2正是这 128 个来自 ASCII 原始版本的字符成为了标准,在任何其他编码中你肯定会找到它们,并且它们会按这个顺序出现。但事实是,借助一个字节的信息,你可以编码的不是128个,而是多达256个不同的值(二的八次方等于256),因此,在Asuka的基本版本之后,一整套系列扩展的 ASCII 编码出现了,其中除了 128 个基本字符之外还可以使用国家编码字符(例如俄语)进行编码。在这里,可能值得多说一下描述中使用的数字系统。首先,众所周知,计算机只能处理二进制系统中的数字,即零和一(“布尔代数”,如果有人在研究所或学校学过的话)。一个字节由八个位组成,每个位代表一个二的二次方,从零开始,一直到二的第七位: 文本编码 ASCII (Windows 1251, CP866, KOI8-R) 和 Unicode (UTF 8, 16, 32) - 如何用破解者解决问题 - 3 不难理解,在这样的结构中,所有可能的零和一的组合都可以只有 256。将数字从二进制转换为十进制非常简单。您只需将两个以上的所有幂相加即可。在我们的示例中,结果是 1(2 的 0 次方)加 8(2 的 3 次方),加上 32(2 的 5 次方),加上 64(6 次方),加上 128 (到七次方)。总计为十进制 233。正如您所看到的,一切都非常简单。但如果您仔细查看包含 ASCII 字符的表,您会发现它们是用十六进制编码表示的。例如,“星号”对应于 Aski 中的十六进制数 2A。您可能知道,在十六进制数字系统中,除了阿拉伯数字之外,还使用从A(表示十)到F(表示十五)的拉丁字母。好吧,将二进制数转换为十六进制采取以下简单的方法。每个字节的信息分为两部分,每部分四位。那些。每个半字节中,只能用二进制编码十六个值(二的四次方),可以很容易地表示为十六进制数。此外,在字节的左半部分,需要从零开始重新计算度数,而不是如屏幕截图所示。结果,我们发现截图中编码的是数字E9。我希望您能清楚我的推理过程和这个难题的解决方案。好吧,现在让我们继续讨论文本编码。

Asuka 的扩展版本 - 带有伪图形的 CP866 和 KOI8-R 编码

因此,我们开始谈论 ASCII,它可以说是所有现代编码(Windows 1251、Unicode、UTF 8)开发的起点。最初,它只包含 128 个拉丁字母、阿拉伯数字和其他字符,但在扩展版本中,可以使用可以在一个字节信息中编码的所有 256 个值。那些。可以在 Aski 中添加您语言的字母符号。在这里,我们需要再次离题,解释为什么需要文本编码以及为什么它如此重要。计算机屏幕上的字符是基于两件事形成的:各种字符的矢量形状(表示)集(它们位于计算机上安装的字体文件中)和允许您准确提取该字符的代码从这组矢量形状(字体文件)中提取需要插入到正确位置的符号。很明显,字体本身负责矢量形状,但操作系统和其中使用的程序负责编码。那些。计算机上的任何文本都是一组字节,每个字节都编码该文本的一个字符。在屏幕上显示这段文字的程序(文本编辑器、浏览器等),在解析代码时,读取下一个字符的编码,并在需要的字体文件中寻找对应的向量形式,连接起来显示这段文字文本文档。一切都是简单而平庸的。这意味着,为了对我们需要的任何字符(例如,国家字母表)进行编码,必须满足两个条件:该字符的矢量形式必须在所使用的字体中,并且该字符可以用扩展 ASCII 编码进行编码在一个字节中。因此,有很多这样的选择。仅用于编码俄语字符,就有多种扩展 Aska。例如,最初出现的CP866能够使用俄语字母表中的字符,并且它是ASCII的扩展版本。也就是说,它的上半部分与 Aska 的基本版本(128 个拉丁字符、数字和其他废话)完全一致,如上面的屏幕截图所示,但 CP866 编码的表格的下半部分具有如图所示的外观。下面的屏幕截图允许编码另外 128 个字符(俄语字母和各种伪图形): 文本编码 ASCII (Windows 1251, CP866, KOI8-R) 和 Unicode (UTF 8, 16, 32) - 如何用破解者解决问题 - 4 你看,在右列中,数字以 8 开头,因为 从 0 到 7 的数字指的是 ASCII 的基本部分(参见第一个屏幕截图)。这样,CP866 中的西里尔字母“M”就会有代码 9C(位于 9 对应的行和十六进制数字 C 的列的交点处),可以用一个字节的信息写入,如果有适合俄语字符的字体,该字母将毫无问题地出现在文本中。这笔钱从哪里来?CP866 中的伪图形?关键在于,这种俄语文本编码是在那些混乱的年代开发的,当时图形操作系统还没有像现在这样普遍。在 Dosa 和类似的文本操作系统中,伪图形至少在某种程度上使文本设计多样化成为可能,因此 CP866 和 Asuka 扩展版本类别中的所有其他同类都大量使用了伪图形。CP866 由 IBM 分发,但除此之外,还为俄语字符开发了多种编码,例如KOI8-R可以归为同一类型(扩展 ASCII) : 文本编码 ASCII (Windows 1251, CP866, KOI8-R) 和 Unicode (UTF 8, 16, 32) - 如何用破解者解决问题 - 5其操作原理与前面描述的 CP866 的情况 - 文本的每个字符都被编码为一个字节。截图显示的是KOI8-R表的后半部分,因为 前半部分与基本的明日香完全一致,如本文第一个屏幕截图所示。在 KOI8-R 编码的特点中,可以注意到其表中的西里尔字母并非按字母顺序排列,如 CP866 中所做的那样。如果您查看第一个屏幕截图(基本部分的屏幕截图,包含在所有扩展编码中),您会注意到在 KOI8-R 中,俄语字母与拉丁字母表的相应字母位于表格的相同单元格中从表的第一部分开始。这样做是为了方便从俄语字符切换到拉丁字符,只需丢弃一位(2 的七次方或 128)。

Windows 1251 - 现代版本的 ASCII 以及出现裂缝的原因

文本编码的进一步发展是由于图形操作系统越来越流行,并且随着时间的推移,在其中使用伪图形的需要消失了。结果,出现了一整组,本质上仍然是明日香的扩展版本(文本的一个字符仅用一个字节的信息进行编码),但没有使用伪符号。它们属于所谓的 ANSI 编码,由美国标准协会开发。一般来说,西里尔字母这个名称也用于支持俄语的版本。Windows 1251就是一个例子。它与之前使用的 CP866 和 KOI8-R 的不同之处在于,其中伪图形符号的位置被俄语印刷术中缺失的符号(重音符号除外)以及接近斯拉夫语言的符号所取代。俄语(乌克兰语、白俄罗斯语等)。): Кодировка текста ASCII (Windows 1251, CP866, KOI8-R) и Юниcode (UTF 8, 16, 32) — How исправить проблему с кракозябрами - 6由于俄语的编码如此丰富,字体制造商和软件制造商不断地头痛,而你和我,亲爱的读者,经常遇到同样臭名昭著的错误的麻烦当与文本中使用的版本发生混淆时。很多时候在通过电子邮件发送和接收消息时就会出现这种情况,这需要创建非常复杂的转换表,这实际上并不能从根本上解决这个问题,并且用户经常使用拉丁字母的音译进行通信,以便避免在使用 CP866、KOI8-R 或 Windows 1251 等俄语编码时出现臭名昭著的乱码。事实上,出现的裂纹而不是俄语文本是由于错误使用给定语言的编码而导致的,该语言与中的编码不对应文本消息最初是编码的。假设,如果您尝试使用 Windows 1251 代码表显示使用 CP866 编码的字符,那么这些相同的乱码(一组无意义的字符)将会出现,完全替换消息的文本。 Кодировка текста ASCII (Windows 1251, CP866, KOI8-R) и Юниcode (UTF 8, 16, 32) — How исправить проблему с кракозябрами - 7在创建和设置网站、论坛或博客时,经常会出现类似的情况,即带有俄语字符的文本被错误地保存为网站默认使用的错误编码,或者保存在错误的文本编辑器中,这会增加一个无形的噱头。用肉眼观察代码。最后,许多人厌倦了这种大量编码和不断爬出垃圾的情况,并且出现了创建新的通用变体的先决条件,该变体将取代所有现有变体并解决出现不可读文本的问题。此外,还有像中文这样的语言的问题,其语言字符远多于256个。

Unicode - 通用编码 UTF 8、16 和 32

东南亚语言组的这数千个字符不可能用分配给 ASCII 扩展版本中的字符编码的一个字节的信息来描述。结果,一个名为Unicode(统一码联盟)的联盟在许多对通用文本编码的出现感兴趣的 IT 行业领导者(那些生产软件的人、编码硬件的人、创建字体的人)的合作下成立了。在 Unicode 联盟的支持下发布的第一个变体是UTF 32。编码名称中的数字表示用于对一个字符进行编码的位数。32 位等于 4 字节的信息,需要用新的通用 UTF 编码来编码单个字符。因此,使用扩展版 ASCII 和 UTF-32 编码的同一文件(在后一种情况下)的大小(重量)将增加四倍。这很糟糕,但现在我们有机会使用 UTF 编码等于 2 的 30 秒次方的字符数(数十亿个字符将覆盖任何真正必要的值,并具有巨大的余量)。但许多使用欧洲集团语言的国家根本不需要在编码中使用如此庞大的字符数,然而,当使用UTF-32时,他们无缘无故地获得了四倍的文本文档权重增加,结果,互联网流量和存储数据量增加。这是很多,没有人能够承受这样的浪费。由于 Unicode 的发展,出现了UTF-16,它非常成功,以至于默认采用它作为我们使用的所有字符的基本空间。它使用两个字节来编码一个字符。让我们看看这个东西是什么样子的。在Windows操作系统中,可以按照“开始”-“程序”-“附件”-“系统工具”-“字符表”的路径进行操作。结果,将打开一个表格,其中包含系统上安装的所有字体的矢量形状。如果您在“高级选项”中选择 Unicode 字符集,您将能够分别查看每种字体中包含的整个字符范围。顺便说一句,点击其中任何一个,你都可以看到它的UTF-16 格式的两字节代码,由四个十六进制数字组成: Кодировка текста ASCII (Windows 1251, CP866, KOI8-R) и Юниcode (UTF 8, 16, 32) — How исправить проблему с кракозябрами - 8使用 16 位可以在 UTF-16 中编码多少个字符?65,536(二的十六次方),这是 Unicode 中采用的基本空间数字。此外,还有一些方法可以使用它来编码大约 200 万个字符,但它们仅限于 100 万个字符的文本扩展空间。但即使是这个成功的 Unicode 编码版本也没有给那些只用英语编写程序的人带来太大的满足,因为从 ASCII 的扩展版本过渡到 UTF-16 后,文档的重量增加了一倍(每个字节一个字节)。 Aski 中的字符和 YUTF-16 中相同字符的两个字节)。正是为了满足 Unicode 联盟中的所有人和所有事物,才决定提出可变长度编码。它被称为 UTF-8。尽管名称中有八个,但它实际上具有可变长度,即 文本的每个字符可以被编码成长度为一到六个字节的序列。实际上,UTF-8 仅使用 1 到 4 个字节的范围,因为超过 4 个字节的代码,理论上甚至不再可能想象任何内容。其中的所有拉丁字符都被编码为一个字节,就像老式的 ASCII 一样。值得注意的是,在仅编码拉丁字母的情况下,即使那些不理解 Unicode 的程序仍然会读取 YTF-8 编码的内容。也就是说,Asuka 的基本部分只是简单地转移到了 Unicode 财团的这个创意中。UTF-8 中的西里尔字符以两个字节编码,例如,格鲁吉亚字符以三个字节编码。Unicode 联盟在创建 UTF 16 和 8 后解决了主要问题 - 现在我们的字体中只有一个代码空间。现在他们的制造商只能根据自己的优势和能力用矢量形式的文本字符填充它。在上面的“字符表”中您可以看到不同的字体支持不同数量的字符。一些富含 Unicode 的字体可能相当重。但现在它们的不同之处并不在于它们是为不同的编码创建的,而是在于字体制造商已经或尚未用某些矢量形式完全填充了单个代码空间。

疯狂的单词而不是俄语字母 - 如何修复它

现在让我们看看如何显示 krakozyabrs 而不是文本,或者换句话说,如何选择俄语文本的正确编码。实际上,它是在您创建或编辑该文本或使用文本片段的代码的程序中设置的。为了编辑和创建文本文件,我个人使用一个非常好的(我认为)Html 和 PHP 编辑器 Notepad++。然而,它可以突出显示数百种其他编程和标记语言的语法,并且还具有使用插件进行扩展的能力。请通过提供的链接阅读对这个精彩程序的详细评论。在 Notepad++ 的顶部菜单中,有一项“编码”,您可以在其中将现有选项转换为默认在您的网站上使用的选项: Кодировка текста ASCII (Windows 1251, CP866, KOI8-R) и Юниcode (UTF 8, 16, 32) — How исправить проблему с кракозябрами - 9对于 Joomla 1.5 及更高版本上的网站,如就 WordPress 上的博客而言,您应该避免出现 Krakozyabrov 选择不带 BOM 的 UTF 8 选项。BOM 前缀是什么?事实是,当他们开发 YUTF-16 编码时,出于某种原因,他们决定附加一种功能,即能够以正序(例如 0A15)和反向(150A)写入字符代码。 。为了让程序能够理解以什么顺序读取代码,发明了BOM(字节顺序标记,或者换句话说,签名),它通过在文档的最开头添加三个附加字节来表示。在UTF-8编码中,Unicode联盟中没有提供BOM,因此添加签名(文档开头那些臭名昭著的额外三个字节)只会阻止某些程序读取代码。因此,在以UTF保存文件时,我们必须始终选择无BOM(无签名)选项。因此,您将提前保护自己免受 krakozyabrs 爬出的影响。值得注意的是,Windows 中的某些程序无法执行此操作(它们无法以没有 BOM 的 UTF-8 格式保存文本),例如同样臭名昭著的 Windows 记事本。它将文档保存为 UTF-8,但仍将签名(三个额外字节)添加到其开头。此外,这些字节将始终相同 - 按直接顺序读取代码。但在服务器上,因为这个小事,就会出现一个问题——骗子就会出来。因此,在任何情况下都不要使用常规 Windows 记事本如果您不希望出现任何裂缝,请编辑您网站上的文档。我认为已经提到的 Notepad++ 编辑器是最好、最简单的选择,它几乎没有缺点,只有优点。在 Notepad++ 中,当您选择编码时,您可以选择将文本转换为 UCS-2 编码,这在本质上非常接近 Unicode 标准。另外,在记事本中,可以用 ANSI 编码文本,即 对于俄语,这将是 Windows 1251,我们已经在上面描述过。这些信息从哪里来?它在 Windows 操作系统的注册表中注册 - 如果是 ANSI,则选择哪种编码;如果是 OEM,则选择哪种编码(对于俄语,则为 CP866)。如果您在计算机上设置另一种默认语言,则这些编码将被替换为该语言的 ANSI 或 OEM 类别中的类似编码。在Notepad++中以您需要的编码保存文档或从站点打开文档进行编辑后,您将能够在编辑器的右下角看到其名称: Кодировка текста ASCII (Windows 1251, CP866, KOI8-R) и Юниcode (UTF 8, 16, 32) — How исправить проблему с кракозябрами - 10为了避免混淆,除了上述步骤之外,在其标头中写入有关此编码的站点所有页面信息的源代码将很有用,这样服务器或本地主机上就不会出现混淆。一般来说,除了Html之外的所有超文本标记语言都使用特殊的xml声明,它指定文本编码。
<?xml version="1.0" encoding="windows-1251"?>
在解析代码之前,浏览器知道正在使用哪个版本以及它需要如何准确地解释该语言的字符代码。但值得注意的是,如果你用默认的Unicode保存文档,这个xml声明可以省略(如果没有BOM,编码将被认为是UTF-8,如果有BOM,编码将被认为是UTF-16)。对于 HTML 文档,Meta 元素用于指示编码,它放置在开始和结束 Head 标记之间:
<head>
...
<meta charset="utf-8">
...
</head>
该条目与 Html 4.01 中的标准有很大不同,但完全符合 Html 5 标准,并且当前使用的任何浏览器都可以正确理解它。理论上,指示 Html 文档编码的 Meta 元素最好放置在文档标题中尽可能高的位置,这样当文本遇到第一个字符时,该字符不是来自基本 ANSI(它总是被正确读取并且在任何变体),浏览器应该已经有关于如何解释这些字符的代码的信息。 原始来源链接:ASCII 文本编码 (Windows 1251、CP866、KOI8-R) 和 Unicode (UTF 8、16、32) - 如何用破解者解决问题
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION