unicode - 在讨论 Unicode 编码时,符号“U+”是什么意思?
问题描述
我意识到这是非常基本的,因为我正在阅读维基百科中的 Unicode 以及它指向的任何地方。但是这个“U+0000”语义没有完全解释。在我看来,“U”总是等于 0。
为什么是符号的“U+”部分?这到底是什么意思?(它似乎是一些基本值,但我无法理解它何时或为什么非零。)
另外,如果我从其他来源收到一串文本,我怎么知道该字符串是 UTF-8、UTF-16 还是 UTF-32 编码的?有什么方法可以根据上下文自动确定吗?
解决方案
-
Unicode 定义了 0 到 10FFFF(十六进制)范围内的 1,114,112 个代码点的代码空间。通常通过写“U+”后跟其十六进制数字来引用 Unicode 代码点。对于基本多语言平面 (BMP) 中的代码点,使用四位数字(例如,字符 LATIN CAPITAL LETTER X 的 U+0058);对于 BMP 之外的代码点,使用五位或六位数字。
引入此约定是为了让读者了解代码点专门是Unicode代码点。例如,字母
ă
(LATIN SMALL LETTER A WITH BREVE)为 U+0103;在代码页 852 中它的代码是 0xC7,在代码页 1250 中它的代码是 0xE3,但是当我写 U+0103 时,每个人都明白我的意思是 Unicode 代码点,他们可以查找它。 对于用拉丁字母书写的语言,UTF-16 和 UTF-32 字符串很可能包含大量值为 0 的字节,这些字节不应出现在 UTF-8 编码字符串中。通过查看哪些字节为零,您还可以推断 UTF-16 和 UTF-32 字符串的字节顺序,即使没有Byte Order Mark也是如此。
例如,如果你得到字节
0xC3 0x89 0x70 0xC3 0xA9 0x65
这很可能
Épée
是 UTF-8 编码。在 little-endian UTF-16 中,这将是0x00 0xC9 0x00 0x70 0x00 0xE9 0x00 0x65
(注意每个偶数字节如何为零。)
推荐阅读
- linq - 使用 linq 查找文本字段是否包含列表中的任何字符串
- java - 参数值 [2020-12-08T07:35] 与预期类型不匹配 [java.time.LocalDateTime (n/a)] jpa hibernate
- multithreading - 数据发布时产生大量Kafka Producer Network Thread,Null Pointer Exception Spring Kafka
- javascript - 如何使用 html2canvas 捕获自定义创建的 js 元素而不将它们渲染到实际的 DOM 中?
- installation - 如何在普通用户权限下安装clickhouse
- azure - 有没有一种从 Azure Blob 存储到 Snowflake EDW 的简单 ETL 方法?
- java - 如何实现一种可以收集android应用程序屏幕上显示的信息的方法
- javascript - MediaRecorder 状态在 Anular 应用程序中自动变为“非活动”
- php - Passport Laravel Exception file_put_contents(/secret-keys/oauth\oauth-public.key): 无法打开流
- django - Django如何从两个表中获取数据并在视图中合并GET请求中的数据