2015-03-02 1 views
0

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

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

Большое спасибо и жаль о длительном вопросе.

ответ

0

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

Проще говоря, 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.