Решать различные типы 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 ‑
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 ‑
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
потерпит неудачу, если вы не используете какое-то "игнорировать" или "заменить на ?
вариант. Почему вы пытаетесь это сделать?