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

Уже есть похожий вопрос . Одно из решений использует такой код:

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 ]

11 голосов
/ 07 февраля 2009

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

Не должно.

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

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

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

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

4 голосов
/ 14 июля 2013

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

2 голосов
/ 07 февраля 2009

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

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

...