2012-05-25 2 views
2

У меня было чертовски время, связанное с контентом, который был скопирован и вставлен из Microsoft Word и представлен в нашу систему.Кодирование с символами Microsoft Word [UTF-8 по ISO-5589-1]

Содержимое включает в себя многобайтовые символы: “ ” ’, которые я бы хотел преобразовать в " " '.

Поскольку наше приложение/база данных настроено для UTF-8, эти многобайтные символы передаются и сохраняются без проблем. Но когда мы объединяем нашу информацию с третьей стороной, использующей ISO-8859-1, мы сталкиваемся с некоторыми проблемами с кодировкой.

У кого-нибудь была эта проблема? Или есть возможное решение?

+0

Что именно вы хотели бы сделать со всеми персонажами, которые не выражены в iso-8859-1? Выкинь их? Попробуйте найти близкий матч? Замените их все на '?'? – sarnold

+0

Идеально найти однобайтовый эквивалент для наиболее популярных экземпляров. цитаты, апострофы и т. д. Любые другие экземпляры можно игнорировать, если они не могут быть выражены. –

ответ

0

Поскольку встроенный метод String#force_encoding преобразует многобайтные символы в представления самих себя, а не замены, вы не можете использовать это.

str = "“ ” ’" 
str.force_encoding("ISO-8859-1") 
#=> "\xE2\x80\x9C \xE2\x80\x9D \xE2\x80\x99" 

Вы можете попробовать String#encode, но это может только заменить все недопустимые/неопределенные символы с чем-то, а не каждый по отдельности.

str = "“ ” ’" 
str.encode("ISO-8859-1", :invalid => :replace, :undef => :replace, :replace => "") 
#=> " " 

str = "“ ” ’ €" 
str.encode("ISO-8859-1", :invalid => :replace, :undef => :replace, :replace => "'") 
#=> "' ' ' '" 

Скорее всего, вам нужно написать или найти библиотеку, которая поддерживает связь между Юникодом многобайтного и ASCII символами они соответствуют, и использовать его.