为什么打印的unicode字符会改变?

Why do the printed unicode characters change?

unicode符号的显示方式取决于我在它之前是否使用了White Heavy Check Mark或Negative Squared Cross Mark。如果我这样做,警告标志就会变色。如果我在符号之间放置一个 space,我会得到类似单色文本的版本。

为什么会存在这种行为,我能否以某种方式强制使用彩色符号?

我尝试了几个不同的 REPL,行为是一样的。

; No colour
(str (char 0x274e) " " (char 0x26A0))
; Coloured
(str (char 0x274e) "" (char 0x26A0))

Clojure unicode display.

我希望符号以相同的方式显示,无论它前面是哪个符号。

Why does this behaviour exist

供应商认为用彩色呈现表情符号 glyhp 是个好主意。这个想法流行起来。

https://en.wikipedia.org/wiki/Emoji#Emoji_versus_text_presentation

can I force the coloured symbol somehow

U+FE0E VARIATION SELECTOR-15 和 U+FE0F VARIATION SELECTOR-16

http://mts.io/2015/04/21/unicode-symbol-render-text-emoji/

Unicode 是关于字符(代码点)的,而不是字形(将其视为字符的 "image")。

字体可以(并且应该)将附近的字符合并为一个字形。在印刷的拉丁文脚本中,这不是很常见(但我们可以使用它,例如 ff、fi、ffi),而不考虑 组合代码点 ,根据定义,它应该与其他字符组合,以只得到一个字形,

许多其他脚本需要它。开始使用草书拉丁文字,但大多数草书都需要更改。例如。阿拉伯语有不同的初始、最终、中间或分隔字符的字形(+特殊组合,草书常见)。印度文字具有类似的行为。

所以 Unicode 的基础已经有了这个行为,现代的好字体应该能够做到。

emojii 使用这样的功能还不算太晚,例如国家 letters/flags 到其他常见案例。

通常 Unicode 文档会告诉您这种可能性,以及可能会改变行为的特殊代码点,但是字体的任务就是实现预期的行为(并找到好的字形)。

因此:字符(作为 unicode 代码点)与设计(字形)不是一对一的。