Решать различные типы UTF дефисов в ruby ​​1.8.7

У нас есть различные типы дефисов / тире (в некотором тексте), заполненные в БД. Прежде чем сравнивать их с вводимым пользователем текстом, мне нужно нормализовать любой тип тире / дефисов до простых дефисов / минусов (ascii 45).

Возможные тире, которые мы должны преобразовать:

Minus(−) U+2212 − or − or −
Hyphen-minus(-) U+002D -
Hyphen(-) U+2010
Soft Hyphen   U+00AD  ­
Non-breaking hyphen  U+2011  &#8209
Figure dash(‒)  U+2012 (8210) ‒ or ‒
En dash(–) U+2013 (8211) –, – or –
Em dash(—) U+2014 (8212) —, — or —
Horizontal bar(―) U+2015 (8213) ― or ―

Все они должны быть преобразованы в дефис-минус (-) с помощью gsub. Я использовал CharDet gem для определения типа кодировки символов выбранной строки. Это показывает Windows-1252. Я пытался Iconv конвертировать кодировку в ascii. Но это вызывает исключение Iconv:: IllegalSequence.

ruby -v => ruby ​​1.8.7 (2009-06-12, уровень исправления 174) [i686-darwin9.8.0]
rails -v => Rails 2.3.5
mysql encoding => 'latin1'

Есть идеи, как этого добиться?

1 ответ

Решение

Предостережение: я ничего не знаю о Ruby, но у вас есть проблемы, которые не имеют ничего общего с языком программирования, который вы используете.

Вам не нужно конвертировать Hyphen-minus(-) U+002D - в simple hyphen/minus (ascii 45); это одно и то же.

Вы считаете, что кодировка базы данных latin1, Там написано: "Мои данные зашифрованы в ISO-8859-1 или латинском1" с надписью "Чек по почте" и "Конечно, я все равно буду любить тебя утром". Все, что он говорит вам, это то, что это кодирование одного байта на символ.

Предполагая, что "извлеченная строка" означает "строка байтов, извлеченная из базы данных", chardet вполне вероятно, совершенно верно в отчетности windows-1252 ака cp1252 - однако это может быть случайно, как chardet иногда кажется, что по умолчанию, когда он исчерпал другие возможности.

(а) Эти символы Юникода не могут быть декодированы в latin1 или же cp1252 или же ascii:

Minus(−) U+2212 − or − or −
Hyphen(-) U+2010
Non-breaking hyphen  U+2011  &#8209
Figure dash(‒)  U+2012 (8210) ‒ or ‒
Horizontal bar(―) U+2015 (8213) ― or ―

Что создает у вас впечатление, что они могут появляться во входных данных или в базе данных?

(б) Эти символы Юникода могут быть декодированы в cp1252 но нет latin1 или же ascii:

En dash(–) U+2013 (8211) –, – or –
Em dash(—) U+2014 (8212) —, — or —

Это (скорее всего, EN DASH) - это то, что вам действительно нужно преобразовать в ascii дефис / тире. Что было в этой строке chardet сообщается как windows-1252?

(с) Это может быть расшифровано в cp1252 а также latin1 но нет ascii:

Soft Hyphen   U+00AD  ­

Если строка содержит символы не ASCII, любая попытка (с использованием iconv или любой другой метод), чтобы преобразовать его в ascii потерпит неудачу, если вы не используете какое-то "игнорировать" или "заменить на ?вариант. Почему вы пытаетесь это сделать?

Другие вопросы по тегам