La conversione da dati Unicode a una determinata pagina di codice utilizza quella che è nota come la strategia "Best-fit" (come indicato nella risposta di @ Paul e nel link che @Martin ha notato in un commento sulla domanda). Secondo quella pagina MSDN per la codifica dei caratteri in .NET Framework :
La mappatura ottimale è il comportamento predefinito per un oggetto Codifica che codifica i dati Unicode in dati della tabella codici ...
Ma cosa sono esattamente questi mapping? La pagina MSDN utilizzata per indicare quanto segue:
Le strategie più adatte variano a seconda della tabella codici e non sono documentate in dettaglio.
Tuttavia, ciò non era del tutto corretto. Forse le "strategie" per determinare le mappature non sono esattamente documentate. Ok. Ma le mappature stesse sono documentate, ma non nei posti più facili da trovare.
Quindi, grazie a Microsoft che sposta la documentazione su GitHub, quella pagina ora indica quanto segue (perché l'ho aggiornato 😸):
Le strategie più adatte non sono documentate in dettaglio. Tuttavia, numerose pagine di codice sono documentate sul sito Web del consorzio Unicode . Si prega di rivedere il readme.txt file in quella cartella per una descrizione di come interpretare i file di mapping.
Se vai al seguente URL vedrai un elenco di diversi file, ognuno chiamato per la pagina di codice a cui associa i caratteri Unicode:
ftp://ftp.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WindowsBestFit/
La maggior parte dei file è stata aggiornata l'ultima volta (o almeno collocata lì) il 04-10-2006 e uno è stato aggiornato il 14-03-2012. La prima parte di questi file mappa i codici ASCII in un punto di codice Unicode equivalente. Ma la seconda parte di ogni file mappa i caratteri Unicode nei loro "equivalenti" ASCII.
Ho scritto uno script di test che utilizza i mapping di Code Page 1252 per verificare se SQL Server sta realmente utilizzando tali mapping. Ciò può essere determinato rispondendo a queste due domande:
- Per tutti i punti di codice mappati, SQL Server li converte nei mapping specificati?
- Per tutti i punti di codice non mappati, SQL Server li converte in un carattere non "
?
"?
Lo script di test è troppo lungo per essere inserito qui, quindi l'ho pubblicato su Pastebin su:
Mapping da Unicode a code page in SQL Server
L'esecuzione dello script mostrerà che la risposta alla prima domanda sopra è "Sì" (il che significa che tutti i mapping forniti sono rispettati). Mostrerà anche che la risposta alla seconda domanda è "No" (che significa che nessuno dei punti di codice non mappati si converte in qualcosa che non sia il carattere di "sconosciuto"). Quindi, quel file di mappatura è molto preciso :-).