我目前是一名学习计算机科学的大学生,在准备网络测试时,书中向我提出了一个有趣的问题。
假设一台计算机是在 Unicode 发明之前创建的,现在表示层接收到此 Unicode,但它超出了其可能的解释范围,那么这些数据发送到这台计算机后会发生什么?它将如何呈现这些信息?
答案1
这取决于具体项目。大多数人都会尽力而为。
计算机中没有单一的“表示层”——它只是操作系统和/或单个程序中定义相当模糊的部分。每个程序在如何将其划分为层方面各不相同(如果有的话)。并且计算机中的所有软件都可以根据需要更新以添加新功能。
(就我个人而言,我不会太关注第 6-7 层,除了它们是“利用会话层的软件”。)
另外,请注意 Unicode 是一种抽象标准,并不通过网络传输 - 程序通常会发送和接收特定编码,例如 UTF-8 或 UTF-16。因此,Unicode 之前的程序不会无缘无故地出现“超出范围”问题,因为它首先不会以这种方式解释接收到的字节。
演示通常由几个单独的任务组成,因此当我在下面说“软件”时,它可能每次都指的是不同的组件。(例如,将 UTF-8 解码为程序的内部表示可能由 libc 处理,布局由 Pango 处理,字体渲染由 FreeType 处理。)
先到先得解码。那么,如果程序收到它无法理解的 UTF-8 消息,它会怎么做呢?通常,如果它知道数据是文本,它会使用某种后备编码对其进行解码。例如,如果旧的 Internet 电子邮件程序看到 MIME 类型
text/plain; charset=utf-8
,它就会知道该消息是文本,并会尝试将其字节解释为 ISO 8859-1 或 Windows-1252,即使结果是垃圾。(实际上,UTF-8 和 ISO 8859 都是基于 ASCII 的,因此许多欧洲文本实际上无论如何都只能解码一半。请参阅维基百科莫吉巴克文章中的示例。
话虽如此,但这并不总是工作 – 某些格式比其他格式更严格。例如,如果 ASN.1 文档有 UnicodeString 而不是 IA5String,旧程序不知道它仍然是文本或其他类型的数据。因此,如果一家韩国公司购买了 SSL 证书,一些旧浏览器会将其名称显示为“组织:[无法识别]”。
然后是解释。如果软件支持旧版本Unicode 并接收代码点超出其已知范围的文本,这在它们显示在屏幕上之前都不是问题 - 此时您将在它们的位置看到“�”替换符号。
当然,如果你告诉文本编辑器将所有内容都大写,它就无法处理超出范围的字符。但它仍然可以工作。
(最近发现,许多“Unicode 兼容”程序和网站在内部使用 UCS-2(最高只能到 U+FFFF)。如果给它们提供代码点高于该值的 UTF-16 编码文本(例如表情符号),它们会将 UTF-16 代理对解释为两个无法识别的代码点,并显示“��”而不是“