2015-08-28 4 views
1

Я использовал cURL, чтобы очистить некоторые обзоры за небольшой эксперимент. Это работало в основном отлично, за исключением некоторых файлов, которые имеют проблемы с кодировкой.Исправить ошибку кодирования

В частности, нет нет проблемы с:

  • файлы без каких-либо специальных символов
  • файлы с экзотическими наборами символов (китайский, японский, корейский, и т.д.)

Однако , у них есть проблемы:

  • файлы wi го лишь несколько специальных символов

Например, итальянский текст:

mi sono fatto dare un menù classico per vedere i loro piatti che solitamente offrono e penso proprio di tornarci 

В данном конкретном случае ù следует ˙U. Утилита «file» сообщает мне, что файл действительно является файлом UTF-8: «HTML-документ, текст Юникода UTF-8, с очень длинными строками». Но vim и другие редакторы неправильно отображают этот символ.

Я хотел бы понять основную причину проблемы. Не удалось ли cURL неправильно кодировать исходный HTML-код и сохранил единственный символ как два символа UTF8? Есть ли способ заставить cURL делать правильные вещи?

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

Есть ли автоматизированный способ устранения этой проблемы? I.e., замените ù на ù (и другие подобные проблемы) и сохраните как UTF8? Ближайший я пришел использовал Iconv:

iconv -f UTF-8 -t ISO-8859-1//TRANSLIT file 

Это устраняет проблему, но сохраняет файл как ISO-8859-1 (который не то, что я хочу). Я также не уверен, что это исправит проблему для каждой ошибки кодирования.

шестнадцатеричного вышеуказанного предложения:

0000000 696d 7320 6e6f 206f 6166 7474 206f 6164 
0000010 6572 7520 206e 656d c36e c283 20b9 6c63 
0000020 7361 6973 6f63 7020 7265 7620 6465 7265 
0000030 2065 2069 6f6c 6f72 7020 6169 7474 2069 
0000040 6863 2065 6f73 696c 6174 656d 746e 2065 
0000050 666f 7266 6e6f 206f 2065 6570 736e 206f 
0000060 7270 706f 6972 206f 6964 7420 726f 616e 
0000070 6372 0a69        
0000074 

HexDump того же предложения после inconv команды выше:

0000000 696d 7320 6e6f 206f 6166 7474 206f 6164 
0000010 6572 7520 206e 656d c36e 20b9 6c63 7361 
0000020 6973 6f63 7020 7265 7620 6465 7265 2065 
0000030 2069 6f6c 6f72 7020 6169 7474 2069 6863 
0000040 2065 6f73 696c 6174 656d 746e 2065 666f 
0000050 7266 6e6f 206f 2065 6570 736e 206f 7270 
0000060 706f 6972 206f 6964 7420 726f 616e 6372 
0000070 0a69         
0000072 
+0

Это выглядит так, как UTF-8 просматривается в программе, которая не распознает текст как UTF-8. Что вы используете для просмотра файла? –

+0

Vim, но я попробовал еще несколько редакторов. Я также использовал ': set fileencoding = utf-8', чтобы убедиться, что это не проблема редактора. – chrisvdb

+0

Не уверен, что тогда не так. Если вы откроете его в редакторе и заставите его рассматривать его как UTF-8, он по-прежнему отображается неправильно? Вы на 100% уверены? Может быть, файл был неверно истолкован по пути, но тогда вы не сможете его исправить, используя iconv, я думаю. Возможно, стоит взглянуть на заголовки, которые отправляются на сайте, который вы очищаете, посмотрите, ошибочно ли он объявляет однобайтную кодировку, но отправляет UTF-8 –

ответ

0

Я думаю set fileencoding=utf-8 неправильный вариант для вас, так как она устанавливает кодировку для записанного файла. Отображаемая кодировка устанавливается с set encoding=utf-8, поэтому вы должны попробовать это вместо этого.

+0

Вы абсолютно что правильная команда: 'set encoding = UTF-8'. К сожалению, однако, это не решает проблему. – chrisvdb

2

Я подозреваю, что у вас есть несколько незначительных вопросов, которые усугубляют друг друга:

  1. эмуляции терминала

    Ваш установлен в «Windows-1252» или «ISO-8859-1». Он должен быть установлен на «UTF-8».
  2. Вы скопировали и вставили вывод в другой файл, чтобы выполнить шестнадцатеричный дамп. Это копирует текст, отображаемый на экране. Кажется, что шестнадцатеричный дамп содержит дополнительные контрольные символы, которые, возможно, поступали из буфера обмена.
  3. Ваш шестиугольный дамп находится в режиме большого конца, что затрудняет просмотр слов или декодирование UTF-8 на глаз.

Когда я принести «http://www.tripadvisor.it/ShowUserReviews-g187849-d2263221-r233247966-Sant_Eustorgio-Milan_Lombardy.html», с моей терминал установлен в «UTF-8» и мой локаль установлена ​​в «en_GB.UTF-8» (Вы должны установить его, к которому когда-либо регион является правильным для Вас, но обеспечить он заканчивается на «.UTF-8»), файл корректно сохраняется как UTF-8 и отображается в vim, cat и less.

+0

То же самое, мне тоже хорошо. –

+0

Хорошо, поэтому основной причиной была некоторая пост-обработка, которую я использовал с помощью [pup] (https://github.com/ericchiang/pup) без флага «-charset utf8». Я grep'ed для 'Ã' и просто перезагрузил эти файлы. – chrisvdb

Смежные вопросы