Вопрос

У меня есть скрипт Ruby, который удаленно генерирует CSV-файл UTF8 на компьютере с Linux, а затем передает файл на компьютер с Windows через SFTP.

Затем мне нужно открыть этот файл с помощью Excel, но Excel не получает UTF8, поэтому мне всегда нужно открывать файл в текстовом редакторе, который имеет возможность конвертировать UTF8 в ANSI.

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

PS:Я пытался использовать iconv, но безуспешно.

Это было полезно?

Решение

ascii_str = yourUTF8text.unpack("U*").map{|c|c.chr}.join

при условии, что ваш текст действительно помещается в набор символов ascii.

Другие советы

Мне наконец удалось сделать это с помощью iconv, я просто испортил параметры. Итак, вот как вы это делаете:


require 'iconv'

utf8_csv = File.open("utf8file.csv").read

# gotta be careful with the weird parameters order: TO, FROM !
ansi_csv = Iconv.iconv("LATIN1", "UTF-8", utf8_csv).join

File.open("ansifile.csv", "w") { |f| f.puts ansi_csv }

Вот и все!

У меня была аналогичная проблема при попытке сгенерировать CSV-файлы из пользовательского контента на сервере.Я нашел тот самый единый декодер драгоценный камень, который отлично справляется с транслитерацией символов unicode в ascii.

Пример:

"olá, mundo!".to_ascii                 #=> "ola, mundo!"
"你好".to_ascii                        #=> "Ni Hao "
"Jürgen Müller".to_ascii               #=> "Jurgen Muller"
"Jürgen Müller".to_ascii("ü" => "ue")  #=> "Juergen Mueller"

Для нашего простого варианта использования это сработало хорошо.

У Pivotal Labs есть отличный пост в блоге о транслитерация unicode в ascii обсудим это более подробно.

Начиная с ruby 1.9, есть более простой способ:

yourstring.encode('ASCII')

Чтобы избежать проблем с недопустимыми символами (отличными от ASCII), вы можете игнорировать проблемы:

yourstring.encode('ASCII', invalid: :replace, undef: :replace, replace: "_")
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top