c# - UTF-16 是 ASCII 的超集吗?如果是,根据 HTML 标准,为什么 UTF-16 与 ASCII 不兼容?
问题描述
根据关于 UTF-16 的 Wikipedia 文章,“...[UTF-16] 也是唯一与 ASCII 不兼容的网络编码。” (在摘要的末尾。)该声明指的是 HTML 标准。这是一个错误的说法吗?
我主要是 C# / .NET 开发人员,.NET 以及 .NET Core 在内部使用 UTF-16 来表示字符串。我很确定 UTF-16 是 ASCII 的超集,因为我可以轻松编写显示所有 ASCII 字符的代码:
public static void Main()
{
for (byte currentAsciiCharacter = 0; currentAsciiCharacter < 128; currentAsciiCharacter++)
{
Console.WriteLine($"ASCII character {currentAsciiCharacter}: \"{(char) currentAsciiCharacter}\"");
}
}
当然,控制字符会弄乱控制台输出,但我认为我的陈述很清楚:16 位的低 7 位char
采用相应的 ASCII 码点,而高 9 位为零。因此 UTF-16 应该是 .NET 中 ASCII 的超集。
我试图找出为什么 HTML 标准说 UTF-16 与 ASCII 不兼容,但似乎他们只是这样定义它:
ASCII 兼容编码是任何不是 UTF-16 编码的编码。
我找不到任何解释为什么 UTF-16 在他们的规范中不兼容。
我的详细问题是:
- UTF-16 实际上与 ASCII 兼容吗?还是我在这里错过了什么?
- 如果兼容,为什么 HTML 标准说它不兼容?也许是因为字节顺序?
解决方案
ASCII 是 7 位编码并存储在单个字节中。UTF-16 使用 2 个字节的块 (ord) ,这使得它立即不兼容。UTF-8 使用一个字节块,拉丁字母与 ASCII 匹配。IOW,UTF-8 旨在向后兼容 ASCII 编码。
推荐阅读
- python-3.x - Python 3套接字客户端未连接到服务器
- javascript - 在我的机器和 AWS-Lambda 上工作时,Node.js 函数会给出不同的结果
- highcharts - Highcharts 系列未加载
- opengl - 是否可以在同一个着色器程序中使用不同的顶点数组对象?
- reactjs - 如何验证父级中的多个表单?
- python - 为什么 print(myTable.__table__) 始终只打印 __tablename__?
- c++ - 使用 C++ 编译器编译 glibc 的 memcmp.c
- node.js - 如何在节点中启用 Intl 以使用 Jest 进行测试?
- c++ - 当重载`<<`时,什么是`std::ostream& (*f)(std::ostream &)`,为什么我需要它?
- c - 如何用随机数填充数组以使它们不同?