Как работает концепция "Суррогатная пара" в базе данных?

Мой вопрос относится к базам данных (и в частности к SQL Server): в официальном руководстве упоминается, что при использовании "NVARCHAR/NCHAR" используется "2 байта памяти на символ" и "если необходима суррогатная пара, символу потребуется 4 байта памяти." Как используется 4 байта, когда нужна суррогатная пара? как эта "потребность" будет сообщаться с SQL Server и как он узнает? Я просто не уверен, как это сработает - когда я программировал, я либо определял что-то как UTF-8, 16 или 32. Кажется, что SQL Server принимает только UTF-16, и он каким-то образом использует суррогатная пара при необходимости. Может кто-нибудь объяснить мне, как это должно работать? Кроме того, я действительно очень ценю источники и ссылки, чтобы я мог больше узнать об этом.

Я попытался прочитать о суррогатных парах, и там буквально ничего нет, кроме некоторых источников, которые просто касаются поверхности и объясняют, что "суррогатная пара - это просто механизм для переопределения символов UTF-32 с использованием двух UTF-16".

Большое спасибо и извините за длинный вопрос.

1 ответ

Решение

Хорошо, иногда лучше провести собственное исследование и найти ответ (хотя это может занять много часов в течение многих дней). В любом случае, я нашел ответ на свой вопрос.

Проще говоря, UCS-2, предшественник UTF-16, представлял собой кодировку FIXED-LENGTH. Это означает, что ВСЕ символы в UCS=-2 занимают ровно 2 байта. UTF-16 был введен после UCS-2, который, в отличие от кодирования переменной длины. Это означало, что UTF-16 посредством суррогатного спаривания позволит определять символы, которые занимают 32 бита вместо 16. Как это делается? В кодировке UTF-16 существует диапазон, зарезервированный для сопряжения. Это означает, что любая кодировка, которая использует этот диапазон (который случается в 1024 точках), автоматически считается ожидающей пары.

Итак, на данном этапе вы можете спросить: "Что произойдет, если у меня будет кодировка USC-2 и моя программа увидит символ в этом запрещенном диапазоне". Ответ просто "Ничего". Этот диапазон не определен UCS-2, и это фактически единственное различие между UTF-16 и UCS. Программа, связанная с UCS, просто не распознает определенные символы UTF-16.

Другие вопросы по тегам