Как изменить кодировку с расширенного ASCII-текста не-ISO, с ограничителями строки CRLF, на UTF-8?

21

У меня есть текстовый файл:

$ file -i x.txt
x.txt: text/plain; charset=unknown-8bit
$ file x.txt 
x.txt: Non-ISO extended-ASCII text, with CRLF line terminators

И есть некоторые символы, которые неправильно закодированы:

trwa³y, sta³y, usuwaæ

Как я могу изменить кодировку этого файла на UTF-8? До сих пор я пробовал следующий способ:

$ iconv -f ASCII -t UTF-8 x.txt
                puiconv: illegal input sequence at position 4

Может быть, я должен как-то использовать extended ASCII( high ASCII), но не могу найти его в iconvсписке кодировки.

Patryk
источник
2
Вы можете загрузить файл куда-нибудь?
Janos
Существует удобный список 8-битных кодировок ISO, все показанные бок о бок, здесь . Кто-нибудь из них выглядит близко к тому, что вы наблюдаете в вашем файле? Например, если вы думаете, что «sta³y» должно быть «stacy», найдите, какая кодировка имеет «c» для любого странного шестнадцатеричного кода в этом слове.
John1024
Вероятно, в 90% случаев «текст не-ISO Extended ASCII» будет файлом, закодированным в кодовую страницу Windows 1252 . «Это, вероятно, самая используемая 8-битная кодировка символов в мире». (Википедия). Попробуйте первым:iconv -f windows-1252 -t utf-8 file
nyov

Ответы:

33

file говорит вам «текст не-ISO с расширенной ASCII», потому что он обнаруживает, что это:

  • скорее всего, «текстовый» файл из-за отсутствия управляющих символов (байтовые значения 0–31), кроме разрывов строк;
  • «Extended-ASCII», потому что есть символы вне диапазона ASCII (байтовые значения ≥128);
  • «Не-ISO», поскольку в диапазоне 128–159 есть символы ( ISO 8859 резервирует этот диапазон для контрольных символов).

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

enca x.txt
enca -L polish x.txt

Чтобы преобразовать файл, передайте -xопцию:enca -L polish x.txt -x utf8 >x.utf8.txt

Если вы не можете или не хотите использовать Enca, вы можете угадать кодировку вручную. Немного оглядываясь, сказал мне, что это польский текст и слова trwały, stały, usuważ, поэтому мы ищем перевод, где ³łи æż. Это выглядит как latin-2 или latin-10 или более вероятно (с учетом «non-ISO» CP1250, который вы просматриваете как latin1 . Чтобы преобразовать файл в UTF-8, вы можете использовать recode или iconv .

recode CP1250..utf8 <x.txt >x.utf8.txt
iconv -f CP1250 -t UTF-8 <x.txt >x.utf8.txt
Gilles 'SO- stop being evil'
источник
Я не понимаю, < x.txt > x.utf8.txtпочему мы используем, <а затем >? Как это работает?
Филипп Бартузи
@FilipBartuzi <и >выполните перенаправление ввода и вывода соответственно .
Жиль "ТАК - перестань быть злым"
1

Откройте текстовый файл с помощью gedit, и в диалоговом окне «Сохранить как ...» вы увидите текущую кодировку.

Gedit
источник
0

Вы пытались узнать, какая именно кодировка x.txt? Вы получите список поддерживаемых кодировок с

iconv - список

Иногда со мной случается, что я получаю несоответствие между latin1 и utf8. Тогда это часто помогает преобразовать его и обратно в utf8 и наоборот.


источник
0

Я создал скрипт автоматического преобразования с использованием библиотеки enca , я использую его на своем NAS для преобразования субтитров в UTF-8, но его можно использовать для любого автоматического преобразования

Не стесняйтесь использовать :)

РЕДАКТИРОВАТЬ:

#!/bin/bash
LANGUAGE=czech
TO=utf8
CONVERT="enca -L $LANGUAGE -x $TO"

# Find and onvert
find ./ -type f -name "*.srt" | while read fn; do
  IS_TARGET=`enca "${fn}" | egrep -ow -m 1 'UTF-8|Unrecognized|KOI8-CS2|7bit ASCII|UCS-2|Macintosh Central European'`

    if [ "$IS_TARGET" != "UTF-8" ] &&
       [ "$IS_TARGET" != "UCS-2" ] &&
       [ "$IS_TARGET" != "Macintosh Central European" ] &&
       [ "$IS_TARGET" != "Unrecognized" ] &&
       [ "$IS_TARGET" != "7bit ASCII" ] &&
       [ "$IS_TARGET" != "KOI8-CS2" ]; then

        echo "${fn} ---- Will be converted!"
    # optional backup of original srt
        # cp "${fn}" "${fn}.bak"
        $CONVERT "${fn}"
    fi  

done
Barlog951
источник