Предупреждение: я ничего не знаю о 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 ‑
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
завершится неудачей, если вы не используете какой-либо параметр «игнорировать» или «заменить на ?
»,Почему вы пытаетесь это сделать?