решать различные типы UTF дефисов в ruby ​​1.8.7 - PullRequest
5 голосов
/ 01 октября 2010

У нас есть различные типы дефисов / тире (в некотором тексте), заполненные в БД.Прежде чем сравнивать их с вводимым пользователем текстом, мне нужно нормализовать любой тип тире / дефисов до простых дефисов / минусов (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 patchlevel 174) [i686-darwin9.8.0]
rails -v => Rails 2.3.5
mysql encoding => 'latin1'

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

1 Ответ

0 голосов
/ 10 октября 2010

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

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

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

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

(a) Эти символы Юникода не могут быть декодированы в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 ―

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

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

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

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

(c) Это может быть декодировано в cp1252 и latin1, но не ascii:

Soft Hyphen   U+00AD  ­

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

...