Кодировка не имеет значения. Разрешенные символы важнее. Проверьте спецификацию CSS . Вот цитата актуальности:
В CSS идентификаторы (включая имена элементов, классы и идентификаторы в селекторах ) могут содержать только символы [a-zA-Z0-9]
и ISO 10646 символов U+00A0
и выше плюс дефис (-
) и подчеркивание (_
); они не могут начинаться с цифры, двух дефисов или дефиса, за которым следует цифра. Идентификаторы также могут содержать экранированные символы и любые символы ISO 10646 в виде числового кода (см. Следующий пункт). Например, идентификатор "B&W?"
может быть записан как "B\&W\?"
или "B\26 W\3F"
.
Обновление : Что касается вопроса о регулярных выражениях, вы можете найти грамматику здесь :
ident -?{nmstart}{nmchar}*
Который состоит из частей:
nmstart [_a-z]|{nonascii}|{escape}
nmchar [_a-z0-9-]|{nonascii}|{escape}
nonascii [\240-\377]
escape {unicode}|\\[^\r\n\f0-9a-f]
unicode \\{h}{1,6}(\r\n|[ \t\r\n\f])?
h [0-9a-f]
Это может быть переведено в регулярное выражение Java следующим образом (я только добавил скобки к частям, содержащим OR и избежал обратной косой черты):
String h = "[0-9a-f]";
String unicode = "\\\\{h}{1,6}(\\r\\n|[ \\t\\r\\n\\f])?".replace("{h}", h);
String escape = "({unicode}|\\\\[^\\r\\n\\f0-9a-f])".replace("{unicode}", unicode);
String nonascii = "[\\240-\\377]";
String nmchar = "([_a-z0-9-]|{nonascii}|{escape})".replace("{nonascii}", nonascii).replace("{escape}", escape);
String nmstart = "([_a-z]|{nonascii}|{escape})".replace("{nonascii}", nonascii).replace("{escape}", escape);
String ident = "-?{nmstart}{nmchar}*".replace("{nmstart}", nmstart).replace("{nmchar}", nmchar);
System.out.println(ident); // The full regex.
Обновление 2 : о, вы больше являетесь PHP'ером, ну, я думаю, вы можете понять, как / где это сделать str_replace
?