EMZETT.
Увійти

UTF-16 і сурогатні пари

Коротко: UTF-16 зберігає символи Unicode в 16-бітних одиницях. Символи за межами перших 65 536 потребують двох одиниць — сурогатної пари.

Докладніше: Java, JavaScript, C# і Windows усередині використовують UTF-16. Тому довжина рядка там часто не дорівнює кількості видимих символів.

Подробиці

  • Базова площина (BMP): Кодові точки U+0000–U+FFFF займають одну одиницю.
  • Сурогатна пара: Кодова точка від U+10000 (багато емодзі) розбивається на старшу (D800–DBFF) і молодшу одиницю (DC00–DFFF).
  • Наслідок: "😀".length у JavaScript дорівнює 2. Якщо розрізати посеред пари, вийде недопустимий символ. Array.from(s) чи for…of працюють за кодовими точками.
  • Порядок байтів: UTF-16LE і UTF-16BE, часто з BOM (byte order mark) на початку файлу.
  • Порівняно з UTF-8: UTF-8 сумісний з ASCII і є стандартом вебу. UTF-16 майже нічого не заощаджує для більшості текстів CJK.
  • Ще тонше: Один видимий символ може складатися з кількох кодових точок (кластери графем, наприклад прапори чи емодзі з відтінком шкіри).

Див. також: UTF-8 і кодування символів