Вызовите iconv из Ruby 1.8.7 через систему, чтобы преобразовать файл из utf-16 в utf-8

Вот что я получил:

path_js = 'path/to/a/js/file.js'
path_new_js = 'path/where/the/converted/file/should/go.js'
puts('iconv -f utf-16le -t utf-8 ' + path_js + ' > ' + path_new_js)
system('iconv -f utf-16le -t utf-8 ' + path_js + ' > ' + path_new_js)

Вывод оператора puts:

iconv -f utf-16le -t utf-8 path/to/1-1-2_E1_MC105.js > compiled/path/to/1-1-2_E1_MC105.js

Если я скопирую и вставлю ту же самую строку в свой терминал, преобразование произойдет успешно, но когда она запустится внутри моего ruby-скрипта, новый файл будет создан с той же кодировкой, что и исходный файл (в данном случае utf-16). Любые идеи о том, что отсутствует/неправильно?

Ваше здоровье!

Обновление: я использую Mac OS X Snow Leopard и попробовал тот же скрипт, используя ruby ​​1.8.7 (по умолчанию) и 1.9.2 (устанавливается с помощью RVM). Я также пробовал следующее:

f = File.open(path_js,'rb')
js = f.read
f.close
new_js = Iconv.conv('utf-8', 'utf-16', js)
File.open(path_new_js,'w'){|f| f.write(new_js)}

Тот же результат :С


person Rafael Vega    schedule 19.08.2011    source источник
comment
Вы уверены, что должны говорить UTF-16LE? Это означает, что в файле нет спецификации. Если вы облажаетесь, выходной файл будет иметь данные, отличные от входного файла. Бьюсь об заклад, вы должны использовать UTF-16, а не UTF-16LE. Почти никогда не указывайте LE или BE.   -  person tchrist    schedule 20.08.2011
comment
Если я использую UTF-16 вместо UTF-16LE, результат будет таким же.   -  person Rafael Vega    schedule 21.08.2011
comment
Вы должны получить на два байта больше с UTF-16, чем с UTF-16LE: спецификация находится в первом, а не во втором.   -  person tchrist    schedule 21.08.2011


Ответы (1)


Это должно быть эквивалентно запуску команды напрямую, поэтому убедитесь, что она действительно работает правильно. system вернет false, если при выполнении возникнет ошибка.

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

person tadman    schedule 19.08.2011
comment
Тогда пришло время попробовать iconv. - person tadman; 22.08.2011