Gor*_*rdy 1 networking codec unicode
我目前是一名正在学习计算机科学的大学生,在为我们的网络测试学习时,我在书中提出了一个有趣的问题。
假设在发明 Unicode 之前创建了一台计算机,现在表示层接收此 Unicode 但它超出了其可能的解释范围,将这些数据发送到这台计算机会发生什么?它将如何呈现这些信息?
这取决于具体的程序。大多数人会尽力而为。
计算机中没有单一的“表示层”——它只是操作系统和/或单个程序的一个相当模糊定义的部分。每个程序的不同之处在于您将其分隔为层的方式(如果有的话)。并且可以根据需要更新计算机中的所有软件以获取新功能。
(我个人根本不会太关注第 6-7 层,除了它们是“利用会话层的软件”。)
此外,要意识到 Unicode 是一个抽象标准,而不是通过网络传输——程序通常会发送和接收特定的编码,例如 UTF-8 或 UTF-16。因此,Unicode 之前的程序不会突然出现“超出范围”的问题,因为它首先不会以这种方式解释接收到的字节。
演示通常由几个单独的任务组成,因此当我在下面说“软件”时,它每次都可能指代不同的组件。(例如,将 UTF-8 解码为程序的内部表示可能由 libc 处理,由 Pango 进行布局,由 FreeType 进行字体渲染。)
首先是解码。那么,如果程序收到一个它不理解的 UTF-8 消息,它会怎么做?通常,如果它知道数据是text,它会使用某种回退编码来解码它。例如,如果一个旧的 Internet 电子邮件程序看到 MIME 类型text/plain; charset=utf-8
,它就会知道该消息是文本的,并会尝试将其字节解释为 ISO 8859-1 或 Windows-1252,即使结果是垃圾。
(碰巧的是,UTF-8 和 ISO 8859 都是基于 ASCII 的,因此许多欧洲文本实际上都会导致中途解码,无论如何。请参阅 Wikipedia Mojibake文章以获取示例。)
也就是说,这并不总是有效——某些格式比其他格式更严格。例如,如果 ASN.1 文档使用 UnicodeString 而不是 IA5String,旧程序将不知道它仍然是文本或其他类型的数据。所以如果一家韩国公司购买了 SSL 证书,一些旧的浏览器会显示他们的名字为“组织:[无法识别]”。
然后是解释。如果软件支持较旧版本的 Unicode 并接收具有已知范围之外的代码点的文本,那么在它们显示在屏幕上之前这不是问题——此时您会看到“?” 替换符号在他们的位置。
当然,如果您例如告诉文本编辑器将所有内容大写,它就无法对超出范围的字符执行此操作。但它仍然会起作用。
(最近,发现许多“兼容 Unicode”的程序和网站在内部使用 UCS-2(只能达到 U+FFFF)。如果给它们提供 UTF-16 编码的文本,并且代码点高于此值(例如表情符号),他们会将 UTF-16 代理对解释为两个无法识别的代码点并显示“??”而不是“”。)
终于有显示了。如果软件解码并识别代码点,但没有字符所需的字体,那么它通常也会绘制占位符。Linux 软件通常会绘制一个矩形,其中包含很小的十六进制数字(代码点编号);macOS改为使用特殊的后备字体;在 Windows 上,您可能会在框中看到问号。
最后,当它涉及到非文字媒体(图片,视频,音频),每种格式是非常不同于他人,因此,如果它不是公认的程序干脆放弃,并显示一个占位符。