Этот простой метод преобразует любую строку ввода в действительный идентификатор Java:
public static String getIdentifier(String str) {
try {
return Arrays.toString(str.getBytes("UTF-8")).replaceAll("\\D+", "_");
} catch (UnsupportedEncodingException e) {
// UTF-8 is always supported, but this catch is required by compiler
return null;
}
}
Пример:
"%^&*\n()" --> "_37_94_38_42_10_56_94_40_41_"
Любые символы ввода будут работать -символы иностранных языков, переводы строк, что угодно!
Кроме того, этот алгоритм:
- воспроизводимый
- уникальный - то есть будет всегда и только даст тот же результат, если
str1.equals(str2)
- обратимый
Благодаря Йоахиму Зауэру за предложение UTF-8
Если коллизии в порядке (где две строки ввода могут дать один и тот же результат), этот код создает читаемый вывод:
public static String getIdentifier(String str) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < str.length(); i++) {
if ((i == 0 && Character.isJavaIdentifierStart(str.charAt(i))) || (i > 0 && Character.isJavaIdentifierPart(str.charAt(i))))
sb.append(str.charAt(i));
else
sb.append((int)str.charAt(i));
}
return sb.toString();
}
Он сохраняет символы, которые являются действительными идентификаторами, преобразуя только те, которыенедопустимы в своих десятичных эквивалентах.