Изображенный выше персонаж был опубликован в Твиттере несколько месяцев назад Микко Хиппоненом, экспертом по компьютерной безопасности, известным своей работой над компьютерными вирусами и беседами TED по компьютерной безопасности. Что касается SO, я буду публиковать только изображения, но вы поняли идею. Это, очевидно, не то, что вы хотели бы распространять по вашему сайту и пугать посетителей.
При дальнейшем осмотре персонаж выглядит как буква тайского алфавита в сочетании с более чем 87 диакритическими знаками (есть ли предел?!). Это заставило меня задуматься о безопасности, локализации и о том, как можно справиться с такого рода вводом. Мои поиски привели меня к этому вопросу о стеке и, в свою очередь, к сообщению в блоге Майкла Каплана о разборке диакритических знаков. В нем он демонстрирует, как можно разложить строку на ее "базовые" символы (здесь для краткости упрощено):
StringBuilder sb = new StringBuilder();
foreach (char c in "façade".Normalize(NormalizationForm.FormD))
{
if (char.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark)
sb.Append(c);
}
Response.Write(sb.ToString()); // facade
Я могу видеть, как это было бы полезно в некоторых случаях, но с точки зрения пользовательского ввода, это исключило бы ВСЕ диакритические знаки. Как указывает Каплан, удаление диакритических знаков в некоторых языках может полностью изменить значение слова. Возникает вопрос: как разрешить некоторые диакритические знаки в пользовательском вводе/выводе, но исключить другие крайние случаи, такие как характер Mikko Hyppönen über?