La conversión de datos Unicode a una página de códigos particular emplea lo que se conoce como la estrategia de "Mejor ajuste" (como se señala en la respuesta de @ Paul y en el enlace que @Martin señaló en un comentario sobre la Pregunta). De acuerdo con esa página de MSDN para la codificación de caracteres en .NET Framework :
El mapeo de ajuste óptimo es el comportamiento predeterminado para un objeto de codificación que codifica datos Unicode en datos de página de códigos ...
Pero, ¿qué son exactamente estas asignaciones? Esa página de MSDN solía decir lo siguiente:
Las estrategias de mejor ajuste varían para diferentes páginas de códigos, y no están documentadas en detalle.
Sin embargo, eso no era del todo correcto. Quizás las "estrategias" para determinar los mapeos no están exactamente documentadas. Okay. Pero, las asignaciones en sí están documentadas, pero no en los lugares más fáciles de encontrar.
Entonces, gracias a que Microsoft movió la documentación a GitHub, esa página ahora dice lo siguiente (porque lo actualicé):
Las estrategias de mejor ajuste no están documentadas en detalle. Sin embargo, varias páginas de códigos están documentadas en el sitio web del Consorcio Unicode . Revise el archivo readme.txt en esa carpeta para obtener una descripción de cómo interpretar los archivos de mapeo.
Si va a la siguiente URL, verá una lista de varios archivos, cada uno con el nombre de la página de códigos a la que asigna los caracteres Unicode:
ftp://ftp.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/
La mayoría de los archivos se actualizaron por última vez (o al menos se colocaron allí) el 04/10/2006, y uno de ellos se actualizó el 14/03/2012. La primera parte de esos archivos asigna códigos ASCII en un punto de código Unicode equivalente. Pero la segunda parte de cada archivo asigna los caracteres Unicode a sus "equivalentes" ASCII.
Escribí un script de prueba que usa las asignaciones de la página de códigos 1252 para verificar si SQL Server realmente está usando esas asignaciones. Eso se puede determinar respondiendo estas dos preguntas:
- Para todos los puntos de código asignados, ¿SQL Server los convierte en las asignaciones especificadas?
- Para todos los puntos de código sin asignar, ¿SQL Server convierte alguno de ellos en un carácter que no sea "
?
"?
El script de prueba es demasiado largo para colocarlo aquí, así que lo publiqué en Pastebin en:
Asignaciones de Unicode a la página de códigos en SQL Server
La ejecución del script mostrará que la respuesta a la primera pregunta anterior es "Sí" (lo que significa que se cumplen todas las asignaciones proporcionadas). También mostrará que la respuesta a la segunda pregunta es "No" (lo que significa que ninguno de los Puntos de código no asignados se convierte en otra cosa que no sea el carácter "desconocido"). Por lo tanto, ese archivo de mapeo es muy preciso :-).