Удаление акцентов / диакритических знаков из строки при сохранении других специальных символов (пробовал mb_chars.normalize и iconv)
Уже есть очень похожий вопрос. Одно из решений использует такой код:
string.mb_chars.normalize(:kd).gsub(/[^x00-\x7F]/n, '').to_s
Который творит чудеса, пока вы не заметите, он также удаляет пробелы, точки, тире и кто знает что еще.
Я не совсем уверен, как работает первый код, но может ли он быть сделан для удаления только акцентов? Или, по крайней мере, дать список символов для сохранения? Мои знания о регулярных выражениях невелики, но я пытался (безрезультатно):
/[^\-x00-\x7F]/n # So it would leave the dash alone
Я собираюсь сделать что-то вроде этого:
string.mb_chars.normalize(:kd).gsub('-', '__DASH__').gsub
(/[^x00-\x7F]/n, '').gsub('__DASH__', '-').to_s
Зверское? Да...
Я также попробовал:
iconv = Iconv.new('UTF-8', 'US-ASCII//TRANSLIT') # Also tried ISO-8859-1
iconv.iconv 'Café' # Throws an error: Iconv::IllegalSequence: "é"
Помогите, пожалуйста?
3 ответа
он также удаляет пробелы, точки, тире, и кто знает, что еще.
Это не должно
string.mb_chars.normalize(:kd).gsub(/[^x00-\x7F]/n, '').to_s
Вы ошиблись, перед x00 должна быть обратная косая черта, чтобы обозначить символ NUL.
/[^\-x00-\x7F]/n # So it would leave the dash alone
Вы поместили '-' между '\' и 'x', что разорвет ссылку на нулевой символ и тем самым нарушит диапазон.
Я бы использовал transliterate
метод. См. http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html.
Это не так аккуратно, как Iconv, но делает то, что я думаю, вы хотите: