Подтвердить что ты не робот

Кодировка Windows-1252 до UTF-8

Я скопировал определенные файлы с Windows-машины на машину Linux. Поэтому все файлы с кодировкой Windows (windows-1252) необходимо преобразовать в UTF-8. Файлы, которые уже находятся в UTF-8, не должны быть изменены. Я планирую использовать для этого утилиту recode. Как я могу указать, что утилита recode должна конвертировать только файлы с кодировкой Windows-1252, а не файлы UTF-8?

Пример использования recode:

recode windows-1252.. myfile.txt

Это преобразует myfile.txt из windows-1252 в UTF-8. Прежде чем это сделать, я хотел бы знать, что myfile.txt на самом деле кодируется Windows-1252, а не кодируется UTF-8. В противном случае я считаю, что это повредит файл.

4b9b3361

Ответ 1

Как вы ожидаете, что recode узнает, что файл Windows-1252? Теоретически, я считаю, что любой файл является допустимым файлом Windows-1252, так как он сопоставляет каждый возможный байт символу.

Теперь есть, безусловно, характеристики, которые бы настоятельно предполагали, что UTF-8 - если он начинается с спецификации UTF-8, например, - но они не были бы окончательными.

Один из вариантов заключается в том, чтобы обнаружить, действительно ли это фактически действительный файл UTF-8, я полагаю... снова, это было бы только наводящим на размышления.

Я не знаком с самим инструментом recode, но вы можете посмотреть, может ли он перекодировать файл из одной и той же кодировки - если вы делаете это с недопустимым файлом (то есть, который содержит недопустимый UTF- 8 байтовых последовательностей), он может преобразовать недопустимые последовательности в вопросительные знаки или что-то подобное. В этот момент вы можете обнаружить, что файл действителен UTF-8, перекодируя его в UTF-8 и видя, идентичны ли вход и выход.

В качестве альтернативы, сделайте это программно, а не используя утилиту recode - это было бы довольно просто в С#, например.

Просто повторю: все это эвристическое. Если вы действительно не знаете кодировку файла, ничто не скажет вам это со 100% -ной точностью.

Ответ 2

iconv -f WINDOWS-1252 -t UTF-8 filename.txt

Ответ 3

Вот транскрипцию другого ответа, который я дал на аналогичный вопрос:

Если вы примените utf8_encode() к уже записанной строке UTF8, она вернет искаженный вывод UTF8.

Я сделал функцию, которая решает все эти проблемы. Он называется Encoding :: toUTF8().

Вам не нужно знать, какова кодировка ваших строк. Это может быть Latin1 (iso 8859-1), Windows-1252 или UTF8, или в строке может быть их сочетание. Encoding :: toUTF8() преобразует все в UTF8.

Я сделал это, потому что служба давала мне все данные, смешивая UTF8 и Latin1 в одной строке.

Использование:

$utf8_string = Encoding::toUTF8($utf8_or_latin1_or_mixed_string);

$latin1_string = Encoding::toLatin1($utf8_or_latin1_or_mixed_string);

Скачать:

https://github.com/neitanod/forceutf8

Обновление:

Я включил другую функцию, Encoding :: fixUFT8(), которая будет исправлять каждую строку UTF8, которая выглядит искаженной.

Использование:

$utf8_string = Encoding::fixUTF8($garbled_utf8_string);

Примеры:

echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("FÃÂédÃÂération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");

выведет:

Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football

Обновление: я преобразовал функцию (forceUTF8) в семейство статических функций в классе под названием Encoding. Новая функция - Encoding :: toUTF8().

Ответ 4

Нет никакого общего способа узнать, закодирован ли файл определенной кодировкой. Помните, что кодировка - это не что иное, как "согласие", как биты в файле должны быть сопоставлены с символами.

Если вы не знаете, какие из ваших файлов на самом деле уже закодированы в UTF-8 и какие из них закодированы в Windows-1252, вам нужно будет проверить все файлы и узнать сами. В худшем случае это может означать, что вам нужно открыть каждый из них одним из двух кодировок и посмотреть, правильно ли они выглядят, т.е. Все символы отображаются правильно. Конечно, вы можете использовать поддержку инструмента для этого, например, если вы точно знаете, что определенные символы содержатся в файлах, которые имеют другое сопоставление в windows-1252 по сравнению с UTF-8, вы могли бы grep для них после запуска файлов через "iconv", как упоминал Сева Аексеев.

Другим удачным случаем для вас было бы, если бы вы знали, что файлы фактически содержат только символы, которые одинаково кодируются как в UTF-8, так и в Windows-1252. В этом случае, конечно, вы уже сделали.

Ответ 5

Если вы хотите переименовать несколько файлов в одной команде - скажем, вы хотите преобразовать все файлы *.txt - вот команда:

find . -name "*.txt" -exec iconv -f WINDOWS-1252 -t UTF-8 {} -o {}.ren \; -a -exec mv {}.ren {} \;

Ответ 6

Используйте команду iconv.

Чтобы убедиться, что файл находится в Windows-1252, откройте его в Блокноте (под Windows), затем нажмите "Сохранить как". Блокнот предлагает текущую кодировку по умолчанию; если это Windows-1252 (или какая-либо 1-байтовая кодовая страница, если на то пошло), она будет говорить "ANSI".

Ответ 7

Вы можете изменить кодировку файла с помощью редактора, такого как блокнот ++. Просто перейдите в Encoding и выберите то, что вы хотите.

Я всегда предпочитаю Windows 1252

Ответ 8

Если вы уверены, что ваши файлы либо UTF-8, либо Windows 1252 (или Latin1), вы можете воспользоваться тем фактом, что recode выйдет с ошибкой, если вы попытаетесь преобразовать недопустимый файл.

В то время как utf8 действителен Win-1252, обратное неверно: win-1252 НЕВОЗМОЖНО UTF-8. Итак:

recode utf8..utf16 <unknown.txt >/dev/null || recode cp1252..utf8 <unknown.txt >utf8-2.txt

Выплевывает ошибки для всех файлов cp1252, а затем переводит их в UTF8.

Я бы обернул это в чистку bash script, сохраняя резервную копию каждого преобразованного файла.

Прежде чем выполнять преобразование кодировки, вы можете сначала убедиться, что у вас есть согласованные окончания строк во всех файлах. В противном случае, recode будет жаловаться из-за этого и может конвертировать файлы, которые уже были UTF8, но просто имели неправильные строки.

Ответ 9

Обнаружено документация для команды TYPE:

Преобразовать файл ASCII (Windows1252) в текстовый файл Unicode (UCS-2):

For /f "tokens=2 delims=:" %%G in ('CHCP') do Set _codepage=%%G    
CHCP 1252 >NUL    
CMD.EXE /D /A /C (SET/P=ÿþ)<NUL > unicode.txt 2>NUL    
CMD.EXE /D /U /C TYPE ascii_file.txt >> unicode.txt    
CHCP %_codepage%    

Техника, описанная выше (на основе script by Carlos M.), сначала создает файл с байтовой меткой (BOM), а затем добавляет содержимое исходного файла. CHCP используется для обеспечения того, чтобы сеанс работал с кодовой страницей Windows1252, чтобы символы 0xFF и 0xFE (ÿþ) были правильно интерпретированы.

Ответ 10

UTF-8 не имеет спецификации, поскольку он является избыточным и недействительным. В тех случаях, когда спецификация полезна в UTF-16, она может быть заменена байтом, как в случае с Microsoft. UTF-16, если для внутреннего представления в буфере памяти. Используйте UTF-8 для обмена. По умолчанию как UTF-8, все остальное, полученное из US-ASCII и UTF-16, является порядком естественного/сетевого байта. Microsoft UTF-16 требует спецификацию, поскольку она заменена байтом.

Чтобы скрыть Windows-1252 до ISO8859-15, я сначала конвертирую ISO8859-1 в US-ASCII для кодов с похожими глифами. Затем я конвертирую Windows-1252 в ISO8859-15, другие не-ISO8859-15-глифы в несколько символов US-ASCII.