Определение, является ли символ буквой

Учитывая набор слов, мне нужно поместить их в хеш-ключ с первой буквой слова. У меня есть слова = {}, с ключами A..Z и 0 для цифр и символов. Я делал что-то вроде

var firstLetter = name.charAt(0);
    firstLetter = firstLetter.toUpperCase();

if (firstLetter < "A" || firstLetter > "Z") {
    firstLetter = "0";
}
if (words[firstLetter] === undefined) {
    words[firstLetter] = [];
} 
words[firstLetter].push(name);

но это не помогает с диерезисом и другими символами, как в словеÄrzteversorgung. That word is put in the "0" array, how could I put it in the "A" array?

 Starkey22 мая 2012 г., 20:37
Ä - это не А. Вам понадобится сопоставление символов с ударениями без акцентов.
 Heitor Chang22 мая 2012 г., 20:42
Проверьте этот пост / Stackoverflow.com вопросы / 863800 / ...
 Rizstien22 мая 2012 г., 20:41
Вы должны указать Ä и другие алфавиты этого символа. как вы делаете для 0 1 2 3 ..... и ABC и т. д.
 Chris Carew22 мая 2012 г., 20:46
Использовать тест на регулярные выражения, как/[\w\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]/.test(firstLetter) подойдет?
 Bergi22 мая 2012 г., 20:37
Вы хотите, чтобы символы, подобные Ä, распознавались как буквы, или вы хотите, чтобы Ä определялись, как если бы это были буквы A?

Ответы на вопрос(4)

есть ли разница. Только буквенные символы изменяются, когда они преобразуются в соответствующие прописные и строчные буквы (цифры, знаки пунктуации и т. Д. Не изменяются). Ниже приведен пример функции с учетом этой концепции:

function isALetter(charVal)
{
    if( charVal.toUpperCase() != charVal.toLowerCase() )
       return true;
    else
       return false;
}
 Danubian Sailor04 нояб. 2014 г., 12:06
не работает с ß, например
Решение Вопроса

JavaScript не считает международные символы «символами слова». Но вы можете сделать это с помощью регулярного выражения ниже:

var firstLetter = name.charAt(0);
firstLetter = firstLetter.toUpperCase();
if (!firstLetter.match(/^\wÀÈÌÒÙàèìòùÁÉÍÓÚÝáéíóúýÂÊÎÔÛâêîôûÃÑÕãñõÄËÏÖÜäëïöüçÇßØøÅåÆæÞþÐð$/)) {
    firstLetter = "0";
}
if (words[firstLetter] === undefined) {
    words[firstLetter] = [];
} 
words[firstLetter].push(name);

чтобы проверить, является ли символвероятнее всег письмо

var firstLetter = name.charAt(0).toUpperCase();
if( firstLetter.toLowerCase() != firstLetter) {
    // it's a letter
}
else {
    // it's a symbol
}

Это работает, потому что в JavaScript уже есть сопоставление строчных и прописных букв (и наоборот), поэтому, если символ не изменяетсяtoLowerCase() тогда его нет в таблице букв.

 Jukka K. Korpela13 янв. 2014 г., 10:46
@ vsync, в вопросе упоминается слово «Ärzteversorgung». Это не английский. Обычно, если люди думают только об английском, они даже не задают этот вопрос - они просто предполагают, что[A-Za-z] закрывает все буквы.
 Jukka K. Korpela03 нояб. 2012 г., 15:02
Он работает только для символов в двухпалатных сценариях, то есть для написания систем, которые различают прописные и строчные буквы; большинство сценариев этого не делают (например, иврит, деванагари, китайский).
 vsync13 янв. 2014 г., 01:44
@ JukkaK.Korpela - Да, есть минусы, а плюсы - скорость проверки. это может быть обработано намного быстрее, чем что-либо еще, и английский язык, вероятно, (должен) быть единственным языком, который нужен большинству людей)
 vsync13 янв. 2014 г., 14:40
Questions в Stackoverflow иногда ничего не значит, потому что я приехал сюда из Google, а то, о чем просил OP, не соответствует названию, поэтому важно охватить ответы для людей, которые приходят сюда из Google для ответов.
 Jukka K. Korpela22 мая 2012 г., 21:07
Интересный трюк, но, как вы подчеркиваете, он работает просто «вероятно». Но это может быть использовано, если вы добавите специальные проверки для всех символов, которые могут появиться и которые приводят к неверному результату в простом тесте. В диапазоне латинского 1 неверно классифицированы следующие символы: º и ª (мужские и женские порядковые индикаторы), резкий ß (вероятно, наиболее значимый здесь символ) и, к сожалению, микро знак µ (формально буква в Unicode, совместимость эквивалентна Греческая буква мю, но широко понимаемая как специальный символ, а не буква).

.charCodeAt(0); чтобы получить позицию в таблице ASCII, а затем сделать некоторые проверки.

Диапазон, который вы ищете, вероятно, составляет 65-90, 97-122, 128-154, 160-165 (включительно), но дважды проверьте это, просмотревASCII Chart

Что-то вроде этог

if((x>64&&x<91)||(x>96&&x<123)||(x>127&&x<155)||(x>159&&x<166))

Гдеx это код символа

 jnrbsn22 мая 2012 г., 20:47
Работает ли это с многобайтовыми символами UTF-8?
 ajax33322122 мая 2012 г., 20:57
Я не знаю,charCodeAt MDN говорит «Кодовые точки Unicode находятся в диапазоне от 0 до 1 114 111»
 Jérôme Verstrynge13 июн. 2013 г., 23:33
@ jnrbsn Нет, не будет ... ASCII не охватывает все, что считается буквой на каждом языке
 Jérôme Verstrynge13 июн. 2013 г., 23:34
@ ajax333221 Есть несколько допустимых кодовых точек, которые не являются печатными символами

Ваш ответ на вопрос