Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unicode 如何确定UTF-16字符的字节宽度?_Unicode_Utf 16_Combining Marks_Ucs - Fatal编程技术网

Unicode 如何确定UTF-16字符的字节宽度?

Unicode 如何确定UTF-16字符的字节宽度?,unicode,utf-16,combining-marks,ucs,Unicode,Utf 16,Combining Marks,Ucs,读取UTF-16字节流以确定字符占用多少字节的规则是什么?我读过这些标准,但根据对现实世界UTF-16编码流的经验观察,似乎有一些标准不适用,或者有一个方面我缺少 阅读UTF-16标准: 前导2字节的值 结果字符长度字节 0x0000-0xC7FF 2. 0xD800-0xDBFF 4. 0xDC00-0xDFFF 无效序列RFC2781 2.2.2 0xDFFF-0xFFFF 4. 你所有的断言都是完全正确的;您对UTF-16标准的解释是正确和完整的 然而,在你的经验观察中,你假设你只有一个角

读取UTF-16字节流以确定字符占用多少字节的规则是什么?我读过这些标准,但根据对现实世界UTF-16编码流的经验观察,似乎有一些标准不适用,或者有一个方面我缺少

阅读UTF-16标准:

前导2字节的值 结果字符长度字节 0x0000-0xC7FF 2. 0xD800-0xDBFF 4. 0xDC00-0xDFFF 无效序列RFC2781 2.2.2 0xDFFF-0xFFFF 4.
你所有的断言都是完全正确的;您对UTF-16标准的解释是正确和完整的

然而,在你的经验观察中,你假设你只有一个角色。实际上,您已经遇到了Unicode实现的细微差别。你的角色实际上是两个,虽然在技术上,而不是视觉上:U+2695埃斯库拉皮乌斯杖,后面是U+FE0F变异选择器-16。第二个字符是一个非间距标记,它与基础字符相结合,用于呈现字符变体

这将导致字节序列26 95 FE 0F,但是正如您所注意到的,这两个字都不在UTF-16保留扩展字符范围内。但这是因为它们都不需要UTF-16 4字节扩展。它们被简单地划分为两个独立的Unicode字符

根据ISO10646:通用编码字符集UCS:中的7.9组合标记

组合标记是Unicode标准中的一类特殊字符,它们是 用于与前面的字符组合,称为基字符

组合标记通常具有可见的字形形式。。。组合标记可以以各种方式与相邻字符进行图形交互


解释我为什么要回答自己的问题;我已经准备好发问了。我妻子走进我的办公室;她回头看了我一眼,对我耳语道:“你知道组合字是一种东西,对吧?”?。不过,我还是问了这个问题,自己也回答了,以防我妻子的甜言蜜语对社区中的其他成员有所帮助。

所有这些的正式定义都被称为扩展的字形集群,它的定义见。正如Joachim Sauer所指出的,在Unicode中小心使用术语字符是明智的

代码点是U+。。。。语法是指,并试图捕捉书面语言的一个单位,例如一个尖锐的口音。但是,读者会认为一个字符(例如带有尖锐口音的e)是一个由一个或多个代码点组成的图形集。最终呈现到屏幕上的是一个glyph,它依赖于上下文和字体

Unicode中的字符集簇实际上比这更微妙。Unicode试图以中立的方式定义它们。在考虑语言时,确实没有中立的东西,但Unicode确实尝试过。例如,在斯洛伐克语中,ch、dz和dž都是一个字母,但在Unicode中被视为两个字母组。试着数一数斯洛伐克语单词中的字母。有些单词包含字母dz,有些单词后面紧跟字母d和字母z。哦,人类书写系统。我非常爱你

从石墨烯簇到glyph的映射也很复杂。例如,在阿拉伯语中,单个字形لا实际上是两个字母组,ل阿拉伯文字母LAM后跟ا阿拉伯文字母ALEF。如果您使用鼠标选择图示符,您将看到有两个可选择的部分,如果您将它们复制并粘贴到另一个窗口,您将看到它们转换为其组成部分。为了让事情变得更复杂,Unicode还为连字定义了一个代码点,阿拉伯文连字LAM带有ALEF独立形式:ﻻ. 如果你尝试选择其中的一部分,你会发现你不能。这是一个角色

你的具体情况有点特殊。变体选择器早于Unicode,主要用于处理汉字的不同变体。然而,与所有Unicode特性一样,它最终主要用于表情符号。VS-16是表情符号表示形式。最著名的例子是红心,它是沉重的黑心❤, 接下来是VS-16:❤️.

类似地,您的角色U+2695 AESCULAPIUS STAFF是一个代码点,默认情况下,它的文本样式如下:⚕. 添加VS-16时,它将以表情符号样式呈现:⚕️. 在某些方面,这是同一个角色。还是这样?取决于你用它做什么

表情符号样式通常稍大一些,并在其块中居中,有时会添加颜色。请注意,在第二个示例中,在每种情况下提取职员后的时间段没有额外的空格;这个标志符号要宽得多

还有其他组合系统:

U+0031:1 U+0031 U+20e3:1⃣ + 组合封闭键帽,默认文本样式 U+0031 U+20e3 U+fe0f:1?