In superficie entrambi i sovraccarichi sembrano essere funzionalmente uguali, tuttavia il drill-down fino alla chiamata a InternalGetUnicodeCategory
rivelerà che provocano chiamate a diversi sovraccarichi di CharUnicodeInfo.GetUnicodeCateogry
.
Il string,int
sovraccarico finisce che attraversa una conversione UTF-32 tramite InternalConvertToUtf32
prima del richiamo del medesimo unico char
InternalGetUnicodeCategory
funzione. Questo spiega la possibilità di decodificare coppie di surrogati in un carattere codificato UTF16.
internal static UnicodeCategory InternalGetUnicodeCategory(String value, int index) {
Contract.Assert(value != null, "value can not be null");
Contract.Assert(index < value.Length, "index < value.Length");
return (InternalGetUnicodeCategory(InternalConvertToUtf32(value, index)));
}
Check out the Conversion implementation here if you want.
Perché questa materia si può chiedere? Beh, la risposta è che .Net supporta gli elementi di testo. Microsoft afferma:
MSDN Documentation on Unicode Support for Surrogate Pairs
Un elemento di testo è un'unità di testo che viene visualizzato come un singolo carattere, chiamato grafema. Un elemento di testo può essere un carattere di base, una coppia surrogata o una sequenza di caratteri combinati.
Mentre non credo la funzione IsSymbol
ei suoi parenti può decodificare Grafemi o combinando sequenze di caratteri, il motivo per il richiamo agli elementi di testo è che possono essere definiti come una coppia di surrogati, e come tale sarebbe bisogno di essere decodificato tramite il string,int
sovraccarico IsSymbol(), IsLetter()
ecc ...
ciò significa che passare una coppia di surrogati tramite il char
sovraccarico sarebbe tornato il risultato sbagliato, perché il carattere della stringa potrebbe essere una coppia di surrogati. Non si può presumere che una codifica a 16 bit rappresenti un singolo carattere, e il fatto di passare il carattere della stringa a detto indice potrebbe rendere tale ipotesi.
Poiché le coppie di surrogati possono essere rappresentati in una stringa in Net, sarebbe ragionare che se si tratta di una stringa che potrebbe contenere uno di questi, il sovraccarico IsSymbol(string s, int index)
sarebbe più appropriato per coprire il caso dove era presente una di queste coppie.
Un esempio specifico in cui i risultati differiscono è
string s = char.ConvertFromUtf32(128204); // ""
Debug.Assert(char.IsSymbol(s[0]) == char.IsSymbol(s, 0)); // Fails
Migliore gestione delle coppie di surrogati UTF16 potrebbe essere una ragione possibile per prendere una stringa immagino. –
@RaphaelMiedl [Sì, è così] (http://referencesource.microsoft.com/#mscorlib/system/globalization/charunicodeinfo.cs). Utilizza GetUnicodeCategory, che utilizza InternalGetUnicodeCategory, che utilizza InternalGetCategoryValue, che esegue la conversione da UTF16 a UTF32, che potrebbe determinare la decodifica delle coppie di surrogati. –
@TravisJ non se c'è una ragione obiettiva per cui si potrebbe essere preferiti. –