Як змінити кодування з розширеного ASCII тексту без ISO, за допомогою лінійних термінаторів CRLF на UTF-8?


21

У мене є файл txt:

$ 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списку кодування.


2
Ви можете десь завантажити файл?
janos

Існує зручний список 8-бітних кодувань ISO, всі показані пліч про бік, тут . Чи хтось із них виглядає близько до того, що ви спостерігаєте у своєму файлі? Наприклад, якщо ви думаєте, що "sta³y" має бути "stacy", то знайдіть, яке кодування має "c" для будь-якого дивного шістнадцяткового коду в цьому слові.
John1024

Ймовірно, 90% часу "Текст без розширеного ISO-ASCII" буде файлом, закодованим на кодовій сторінці Windows 1252 . "Це, мабуть, найбільш уживане 8-бітове кодування символів у світі." (Вікіпедія). Спробуйте спочатку:iconv -f windows-1252 -t utf-8 file
nyov

Відповіді:


33

file повідомляє вам "Текст без розширеного ISO-ASCII", оскільки він виявляє, що це:

  • швидше за все, «текстовий» файл із відсутністю контрольних символів (значення байтів 0–31), крім розривів рядків;
  • "Розширений 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 або більш імовірна (з урахуванням "не-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

Я не розлучаюся з < x.txt > x.utf8.txtЧому ми використовуємо <і тоді >? Як це працює?
Філіп Бартузі


1

Відкрийте текстовий файл за допомогою 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.