Удаление акцентов/диакритических знаков из строки с сохранением других специальных символов (пробовал mb_chars.normalize и iconv)

StackOverflow https://stackoverflow.com/questions/522715

Вопрос

Есть очень аналогичный вопрос уже.В одном из решений используется такой код:

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: "é"

Помоги пожалуйста?

Это было полезно?

Решение

он также удаляет пробелы, точки, тире и бог знает что еще.

Это не должно быть так.

string.mb_chars.normalize(:kd).gsub(/[^x00-\x7F]/n, '').to_s

Вы ошиблись, перед x00 должна быть обратная косая черта, обозначающая нулевой символ.

/[^\-x00-\x7F]/n # So it would leave the dash alone

Вы поместили «-» между «\» и «x», что нарушит ссылку на нулевой символ и, таким образом, нарушит диапазон.

Другие советы

я бы использовал transliterate метод.Видеть http://api.rubyonrails.org/classes/ActiveSupport/Inflector.html#method-i-transliterate

Это не так аккуратно, как Iconv, но делает то, что, я думаю, вам нужно:

http://snippets.dzone.com/posts/show/2384

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top