57 81 различных ответов на этот вопрос, некоторые не по теме, и все же ни один из них не поднимает важную проблему, заключающуюся в том, что ни одно из перечисленных решений не будет работать с азиатскими иероглифами, смайликами и другими высокими юникод- Точечные символы во многих браузерах. Вот решение, которое будет:
const consistantCapitalizeFirstLetter = "\uD852\uDF62".length === 1 ?
function(S) {
"use-strict"; // Hooray! The browser uses UTF32!
return S.charAt(0).toUpperCase() + string.substring(1);
} : function(S) {
"use-strict";
// the browser is using UCS16 to store UTF16
var code = S.charCodeAt(0)|0;
return (
code >= 0xD800 && code <= 0xDBFF ? // detect surrogate pair
S.slice(0,2).toUpperCase() + string.substring(2) :
S.charAt(0).toUpperCase() + string.substring(1)
);
};
const prettyCapitalizeFirstLetter = "\uD852\uDF62".length === 1 ?
function(S) {
"use-strict"; // Hooray! The browser uses UTF32!
return S.charAt(0).toLocaleUpperCase() + string.substring(1);
} : function(S) {
"use-strict";
// the browser is using UCS16 to store UTF16
var code = S.charCodeAt(0)|0;
return (
code >= 0xD800 && code <= 0xDBFF ? // detect surrogate pair
S.slice(0,2).toLocaleUpperCase() + string.substring(2) :
S.charAt(0).toLocaleUpperCase() + string.substring(1)
);
};
Обратите внимание, что вышеуказанное решение пытается учесть UTF32. Тем не менее, в спецификации официально говорится, что браузеры обязаны делать все в UTF16, сопоставленном с UCS2. Тем не менее, если мы все соберемся вместе, выполним свою часть и начнем готовиться к UTF32, то есть вероятность, что TC39 может позволить браузерам начать использовать UTF32 (например, как Python использует 24-битные символы для каждого символа строки). Для говорящего на английском это должно показаться глупым: никому, кто использует только латиницу-1, никогда не приходилось иметь дело с Мохибаке , потому что Latin-I поддерживается всеми кодировками символов. Но пользователям в других странах (таких как Китай, Япония, Индонезия и т. Д.) Не так повезло. Они постоянно борются с проблемами кодирования не только с веб-страницы, но и с Javascript: многие китайские / японские символы обрабатываются Javascript как две буквы и, следовательно, могут быть разбиты на части в середине, что приводит к и (два знака вопроса что не имеет смысла для конечного пользователя). Если бы мы могли начать готовиться к UTF32, то TC39 мог бы просто позволить браузерам делать то, что делал Python много лет назад, что сделало Python очень популярным для работы с символами высокого юникода: с использованием UTF32.
consistantCapitalizeFirstLetter
работает правильно в IE3 + . prettyCapitalizeFirstLetter
требует IE5.5 + (см. Верхнюю часть страницы 250 этого документа ). Однако это не просто шутки, потому что вполне вероятно, что остальная часть кода на вашей веб-странице не будет работать даже в IE8 - из-за всех ошибок DOM и JScript и отсутствия функций в этих старых браузерах. Кроме того, никто больше не использует IE3 или IE5.5.