An der Oberfläche scheinen beide Überlastungen funktional die gleichen zu sein, aber das Bohren bis zum Aufruf an InternalGetUnicodeCategory
wird enthüllen, dass sie Aufrufe unterschiedlicher Überlastungen von CharUnicodeInfo.GetUnicodeCateogry
ergeben.
Die string,int
Überlastung endet Durchlauf durch eine UTF32 Konvertierung über InternalConvertToUtf32
vor derselben einzelnen char
InternalGetUnicodeCategory
Funktion aufruft. Dies berücksichtigt die Möglichkeit, Ersatzpaare in einem UTF16-codierten Zeichen zu dekodieren.
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.
Warum diese Frage könnten Sie fragen? Die Antwort darauf ist, dass .Net Textelemente unterstützt. Microsoft heißt es:
MSDN Documentation on Unicode Support for Surrogate Pairs
Ein Textelement eine Einheit von Text, der als ein einzelnes Zeichen angezeigt wird, ein Graphem genannt. Ein Textelement kann ein Basiszeichen, , ein Ersatzpaar oder eine kombinierende Zeichenfolge sein.
Während ich nicht glaube, die IsSymbol
Funktion und ihre Angehörigen können Grapheme oder die Kombination von Zeichenfolgen entschlüsseln, der Grund für die callout Elemente in Text ist, dass sie können als Ersatzpaar definiert werden, und als solche würde muß über die string,int
Überlastung von IsSymbol(), IsLetter()
decodiert werden etc ...
Was dies bedeutet, dass ist ein Ersatzpaar über die char
Überlastung vorbei das falsche Ergebnis zurückkehren würde, da die Zeichen in der Zeichenfolge ein Ersatzpaar sein könnten. Sie können nicht davon ausgehen, dass eine 16-Bit-Codierung ein einzelnes Zeichen darstellt, und die Übergabe des Zeichens der Zeichenfolge an diesen Index würde diese Annahme treffen.
Da Surrogat-Paare können in einem String in .NET dargestellt werden, wäre es, dass die Vernunft, wenn Sie mit einer Zeichenfolge handeln, die eine davon enthalten könnte, die IsSymbol(string s, int index)
Überlastung wäre besser geeignet, um den Fall zu decken wo eines dieser Paare anwesend war.
Ein konkretes Beispiel, wo die Ergebnisse unterscheiden ist
string s = char.ConvertFromUtf32(128204); // ""
Debug.Assert(char.IsSymbol(s[0]) == char.IsSymbol(s, 0)); // Fails
Bessere Handhabung von utf16 Ersatzpaaren könnte ein möglicher Grund sein, um eine Zeichenfolge zu nehmen ich mich vorstellen. –
@RaphaelMiedl [Ja, das ist es] (http://referencesource.microsoft.com/#mscorlib/system/globalization/charunicodeinfo.cs). Es verwendet GetUnicodeCategory, das InternalGetUnicodeCategory verwendet, das InternalGetCategoryValue verwendet, das UTF16-zu-UTF32-Konvertierung ausführt, die zu dem Entschlüsseln von Ersatzpaaren führen kann. –
@TravisJ nicht, wenn es einen objektiven Grund gibt, warum man bevorzugt werden könnte. –