Преобразование данных Unicode в конкретную кодовую страницу использует так называемую стратегию «наилучшего соответствия» (как отмечено в ответе @ Paul и по ссылке, которую @Martin отметил в комментарии к Вопросу). Согласно этой странице MSDN для кодировки символов в .NET Framework :
Наилучшее соответствие - это поведение по умолчанию для объекта Encoding, который кодирует данные Unicode в данные кодовой страницы ...
Но что именно эти отображения? Эта страница MSDN используется заявить следующее:
Наиболее подходящие стратегии различаются для разных кодовых страниц, и они подробно не документированы.
Однако это было не совсем правильно. Возможно, «стратегии» определения отображений точно не задокументированы. Хорошо. Но, отображения сами являются документированные, просто не в самых простых местах , чтобы найти.
Итак, благодаря Microsoft, переместившей документацию на GitHub, эта страница теперь гласит следующее (потому что я обновил ее 😸):
Наиболее подходящие стратегии подробно не документированы. Тем не менее, несколько кодовых страниц задокументированы на веб-сайте Консорциума Unicode . Пожалуйста, просмотрите файл readme.txt в этой папке для описания того, как интерпретировать файлы сопоставления.
Если вы перейдете по следующему URL-адресу, вы увидите список из нескольких файлов, каждый из которых назван для кодовой страницы, в которую он отображает символы Unicode:
ftp://ftp.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/
Большинство файлов были в последний раз обновлены (или, по крайней мере, размещены там) 2006-10-04, а один из них был обновлен 2012-03-14. Первая часть этих файлов отображает коды ASCII в эквивалентную кодовую точку Unicode. Но вторая часть каждого файла отображает символы Unicode в их «эквиваленты» ASCII.
Я написал тестовый скрипт, который использует сопоставления Кодовой страницы, чтобы проверить, действительно ли SQL Server использует эти сопоставления. Это можно определить, ответив на эти два вопроса:
- Для всех сопоставленных точек кода SQL Server преобразует их в указанные сопоставления?
- Для всех не отображенных кодовых точек SQL Server преобразует любой из них в не "
?
" символ?
Тестовый скрипт слишком длинный, чтобы разместить его здесь, поэтому я разместил его на Pastebin по адресу:
Unicode для сопоставления кодовых страниц в SQL Server
Запуск сценария покажет, что ответом на первый вопрос выше является «Да» (что означает, что все предоставленные сопоставления соблюдаются). Это также покажет, что ответом на второй вопрос является «Нет» (то есть ни один из не нанесенных на карту кодовых точек не превращается ни во что, кроме символа «неизвестный»). Следовательно, этот файл отображения очень точный :-).