Il punto di codice Unicode del carattere 🤘 è U+1F918 , il che significa che non rientra nel Aereo multilingue di base (BMP) di Unicode, che copre codepoint fino a U+FFFF.
Per elaborare i caratteri Unicode al di fuori del BMP, è necessario applicare collazioni che supportano i caratteri supplementari
, denominato *_SC
:
Confronta i risultati di questa istruzione SQL
select
nchar(unicode(N'🤘' collate Latin1_General_100_CI_AS_SC)) as EmojiSC,
unicode(N'🤘' collate Latin1_General_100_CI_AS_SC) as EmojiSCUnicode,
cast(N'🤘' as varbinary) as EmojiBinary,
cast(nchar(unicode(N'🤘')) as varbinary) as EmojiConvBinary,
unicode(N'🤘') as EmojiUnicode
come eseguito su un database utilizzando Latin1_General_CI_AS
EmojiSC EmojiSCUnicode EmojiBinary EmojiConvBinary EmojiUnicode
NULL 129304 0x3ED818DD 0x3ED8 55358
rispetto a un database impostato su Latin1_General_100_CI_AI_SC
EmojiSC EmojiSCUnicode EmojiBinary EmojiConvBinary EmojiUnicode
🤘 129304 0x3ED818DD 0x3ED818DD 129304
Perché vedi "🤘
"?
La codifica UTF-8 di U+1F918 è 0xF0 0x9F 0xA4 0x98 e i caratteri sono il risultato dell'interpretazione di questi codici come caratteri ANSI .
Perché vedi "�"?
Il carattere � è il CARATTERE SOSTITUTIVO Unicode ed è
e questo perché U+D83E è non un codepoint Unicode valido , ma la prima parola del codepoint codificata come UTF-16 (0xD83E 0xDD18
).
Controlla cosa è memorizzato, non cosa viene visualizzato
La visualizzazione dei dati Unicode può essere complicata e il modo più efficiente per scoprire cosa sta succedendo sotto il cofano è guardare i byte. In TSQL, usa cast(... as varbinary)
per analizzare dove la manipolazione dei dati Unicode va storta.