我们试图将表情符号插入数据库,但遇到了奇怪的行为。事实证明这与utf-8编码有关。会工作得很好,但不会。这是我们了解 utf-8 代码点的时候。是一个代码点长,但为 2:由 Hot Pepper (U+1F336) 和 Variation Selector-16 (U+FE0F) 组成。
\n了解这一点后,我们将数据库存储宽度增加到2,这解决了 的问题,但我们发现了一个新问题。键帽表情符号 (1\xef\xb8\x8f\xe2\x83\xa32\xef\xb8\x8f\xe2\x83\xa33\xef\xb8\x8f\xe2\x83\xa3) 为 3 个字符:1 个 (U+31 )、变体选择器-16 (U+FE0F) 和组合封闭键帽 (U+20E3)。
\n“好吧,”我们说,“把它增加到 4。” 然后 \xe2\x80\x8d\xe2\x99\x82\xef\xb8\x8f 带有 5 个代码点:Face Palm (U+1F926)、表情符号修改器 Fitzpatrick Type-3 (U+1F3FC)、零宽度连接器 ( U+200D)、男性符号 (U+2642) 和变体选择器-16 (U+FE0F)。我们进行了更多尝试,发现英格兰国旗由 7 个代码点组成:
\n所以问题是,显示的 unicode 字符可以使用的最大代码点数量是多少?是否有任何代码点高于 7 个的表情符号(或其他 utf-8 字符)示例?
\n此问题与问题UTF-8 编码字符的最大字节数是多少?类似但不同。。这需要一个 UTF-8 代码点,最大字节数是多少?(剧透:4)。这个问题与Unicode 有定义的最大代码点数量类似吗?,但这就是询问存在多少个不同的代码点。不是可以连续使用多少个字符来组成屏幕上显示的单个字符。
\n你还没有接触到长的......
\n您的问题有两个简短的答案:
\n这些是 ZWJ(零宽度连接器)序列,通常是推荐中最长的表情符号序列。您可以在emoji-zwj-sequences中获取当前推荐的列表。
\n我见过讨论过的最长序列(但不是建议的一部分)是 11,用于肤色修改的家庭序列(例如,woman-medium-zwj-woman-dark-zwj-girl-light-zwj-女孩-中号)。这个序列几乎肯定会破坏 Unicode(支持它会添加超过 4000 个新字形),因此它不太可能出现在推荐中。
\n但仅仅因为不推荐它并不意味着它不合法。我可以将任意数量的人组合成一个家庭序列,为每个人附加性别、头发颜色和肤色,这是一个合法的序列,并将呈现为单个“角色”。例如,这是上面讨论的带有肤色修饰符的家庭表情符号: \xe2\x80\x8d\xe2\x80\x8d\xe2\x80\x8d 它呈现为四个人,但如果您的文本引擎正常工作,您将发现它选择作为单个“字符”,因为它是。在任何常见字体中都没有特殊的字形。
\n我还可以无限制地添加其他修饰符,您可以将它们添加到任意字符(不仅仅是表情符号)。有关所有血腥细节,请参阅UTS #51:Unicode 表情符号。
\n然后你提出了“或其他 utf-8 字符”的进一步问题。这实际上是关于组合字符,并且介绍了:
\n\nUnicode 对可以附加到单个“起始”字符的组合字符的数量没有限制。
\n但是,Unicode 确实定义了流安全文本格式,该格式将每个“块”的组合字符限制为 30 个。(它实际上允许通过插入 COMBINING GRAPHEME JOINER 来附加组合字符,但这些字符是单独标准化的。)完整的块总共不会包含超过 32 个字符,并且在 UTF-8 中编码时不需要超过 128 个字节。
\n正如规范所指出的,“选择 30 的值明显超出了任何语言或技术用途所需的值。” 我听说过的最大的是藏文HAK\xe1\xb9\xa2HMALAWARAYA\xe1\xb9\x80中的8个组合字符(\xe0\xbd\xa7\xe0\xbe\x90\xe0\xbe\xb5\xe0\ xbe\xa8\xe0\xbe\xb3\xe0\xbe\xba\xe0\xbe\xbc\xe0\xbe\xbb\xe0\xbe\x82)。那是一个角色。(也就是说,虽然我经常看到这个特定的例子,但我从未见过任何人描述藏人如何使用它,所以我无法确认这实际上是一个真实的字符。)
\n| 归档时间: |
|
| 查看次数: |
172 次 |
| 最近记录: |