57 81 verschiedene Antworten auf diese Frage, einige davon themenfremd, und doch keine Sie werfen das wichtige Problem auf, dass keine der aufgeführten Lösungen mit asiatischen Schriftzeichen, Emojis und anderen Zeichen mit hohem Unicode-Punktwert in vielen Browsern funktionieren wird. Hier ist eine Lösung, die es tut:
const consistantCapitalizeFirstLetter = "\uD852\uDF62".length === 1 ?
function(S) {
"use-strict"; // Hooray! The browser uses UTF-32!
return S.charAt(0).toUpperCase() + S.substring(1);
} : function(S) {
"use-strict";
// The browser is using UCS16 to store UTF-16
var code = S.charCodeAt(0)|0;
return (
code >= 0xD800 && code <= 0xDBFF ? // Detect surrogate pair
S.slice(0,2).toUpperCase() + S.substring(2) :
S.charAt(0).toUpperCase() + S.substring(1)
);
};
const prettyCapitalizeFirstLetter = "\uD852\uDF62".length === 1 ?
function(S) {
"use-strict"; // Hooray! The browser uses UTF-32!
return S.charAt(0).toLocaleUpperCase() + S.substring(1);
} : function(S) {
"use-strict";
// The browser is using UCS16 to store UTF-16
var code = S.charCodeAt(0)|0;
return (
code >= 0xD800 && code <= 0xDBFF ? // Detect surrogate pair
S.slice(0,2).toLocaleUpperCase() + S.substring(2) :
S.charAt(0).toLocaleUpperCase() + S.substring(1)
);
};
Bitte beachten Sie, dass die obige Lösung versucht, UTF-32 zu berücksichtigen. In der Spezifikation heißt es jedoch offiziell, dass die Browser alles in UTF-16 abbilden müssen, das auf UCS2 abgebildet wird. Wenn wir jedoch alle zusammenkommen, unseren Teil dazu beitragen und uns auf UTF32 vorbereiten, dann besteht die Chance, dass die TC39 den Browsern die Verwendung von UTF-32 erlaubt (so wie Python 24 Bits für jedes Zeichen der Zeichenkette verwendet). Das muss einem Englisch sprechenden Menschen dumm vorkommen: Niemand, der nur Latein-1 verwendet, hat sich jemals mit Mojibake weil Latin-I von allen Zeichenkodierungen unterstützt wird. Benutzer in anderen Ländern (wie China, Japan, Indonesien usw.) haben jedoch nicht so viel Glück. Sie haben ständig mit Kodierungsproblemen zu kämpfen, die nicht nur von der Webseite, sondern auch von JavaScript verursacht werden: Viele chinesische/japanische Zeichen werden von JavaScript als zwei Buchstaben behandelt und können daher in der Mitte auseinandergebrochen werden, was zu und führt (zwei Fragezeichen, die für den Endbenutzer keinen Sinn ergeben). Wenn wir anfangen könnten, uns auf UTF-32 vorzubereiten, dann könnte TC39 den Browsern erlauben, das zu tun, was Python vor vielen Jahren getan hat, was Python für die Arbeit mit vielen Unicode-Zeichen sehr populär gemacht hat: UTF-32 verwenden.
consistantCapitalizeFirstLetter
funktioniert korrekt in Internet Explorer 3+ (wenn die const
wird geändert in var
). prettyCapitalizeFirstLetter
erfordert Internet Explorer 5.5+ (siehe oben auf Seite 250 von dieses Dokument ). Diese Tatsache ist jedoch eher ein Witz, denn es ist sehr wahrscheinlich, dass der Rest des Codes auf Ihrer Webseite nicht einmal in Internet Explorer 8 - wegen all der DOM- und JScript-Fehler und des Mangels an Funktionen in diesen älteren Browsern. Außerdem verwendet niemand mehr Internet Explorer 3 oder Internet Explorer 5.5.