Неверный скаляр лица собаки - PullRequest
0 голосов
/ 23 января 2019

Мне показалось, что я хорошо понимаю скаляры Юникода в Swift, но смайлик с собачьей мордой доказал, что я не прав.

for code in "?".utf16 {
    print(code)
}

Коды UTF-16: 55357 и 56374. В гексах это d83d и dc36.

Сейчас:

let dog = "\u{d83d}\u{dc36}"

Вместо того, чтобы получить строку с "getting", я получаю ошибку:

Неверный скаляр Unicode

Я пытался с кодами UTF-8, и он тоже не работал. Не выдает ошибку, а возвращает «¶¶» вместо собачьего лица.

Что здесь не так?

1 Ответ

0 голосов
/ 23 января 2019

В escape-последовательности \u{nnnn} ожидается скалярное значение Unicode , а не представление UTF-16 (с высокими и низкими суррогатами):

for code in "?".unicodeScalars {
    print(String(code.value, radix: 16))
}
// 1f436

let dog = "\u{1F436}"
print(dog) // ?

Решения для восстановления строки изего представление UTF-16 можно найти по адресу Есть ли способ создать строку из массива utf16 в swift? .Например:

let utf16: [UInt16] = [ 0xd83d, 0xdc36 ]
let dog = String(utf16CodeUnits: utf16, count: utf16.count)
print(dog) // ?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...