A conversão de dados Unicode em uma página de código específica emprega a estratégia conhecida como "Melhor ajuste" (conforme observado na resposta de @ Paul e no link que @Martin anotou em um comentário sobre a Pergunta). De acordo com a página do MSDN para codificação de caracteres no .NET Framework :
O mapeamento de melhor ajuste é o comportamento padrão de um objeto Encoding que codifica dados Unicode em dados da página de código ...
Mas o que exatamente são esses mapeamentos? Essa página do MSDN costumava indicar o seguinte:
As estratégias de melhor ajuste variam para diferentes páginas de código e não são documentadas em detalhes.
No entanto, isso não estava totalmente correto. Talvez as "estratégias" para determinar os mapeamentos não estejam exatamente documentadas. Está bem. Mas, os próprios mapeamentos são documentados, mas não nos lugares mais fáceis de encontrar.
Portanto, graças à Microsoft movendo a documentação para o GitHub, essa página agora declara o seguinte (porque eu a atualizei):
As estratégias de melhor ajuste não são documentadas em detalhes. No entanto, várias páginas de código estão documentadas no site do Unicode Consortium . Revise o arquivo readme.txt nessa pasta para obter uma descrição de como interpretar os arquivos de mapeamento.
Se você for para o URL a seguir, verá uma lista de vários arquivos, cada um nomeado para a Página de Código para a qual mapeia caracteres Unicode:
ftp://ftp.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/
A maioria dos arquivos foi atualizada pela última vez (ou pelo menos foi colocada lá) em 04/10/2006, e um deles foi atualizado em 14/03/2012. A primeira parte desses arquivos mapeia códigos ASCII em um ponto de código Unicode equivalente. Mas a segunda parte de cada arquivo mapeia os caracteres Unicode em seus "equivalentes" ASCII.
Eu escrevi um script de teste que usa os mapeamentos de código para verificar se o SQL Server está realmente usando esses mapeamentos. Isso pode ser determinado respondendo a essas duas perguntas:
- Para todos os Code Points mapeados, o SQL Server os converte nos mapeamentos especificados?
- Para todos os Code Points não mapeados, o SQL Server converte algum deles em um
?
caractere " " não " "?
O script de teste é muito longo para ser colocado aqui, então eu o publiquei no Pastebin em:
Mapeamentos Unicode para Página de Código no SQL Server
A execução do script mostrará que a resposta para a primeira pergunta acima é "Sim" (significando que todos os mapeamentos fornecidos são respeitados). Também mostrará que a resposta para a segunda pergunta é "Não" (ou seja, nenhum dos Pontos de código não mapeados se converte em nada além do caractere "desconhecido"). Portanto, esse arquivo de mapeamento é muito preciso :-).