Comment changer l'encodage du texte ASCII étendu non ISO, avec les terminateurs de ligne CRLF en UTF-8?

21

J'ai un fichier 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

Et il y a certains caractères qui sont mal encodés:

trwa³y, sta³y, usuwaæ

Comment puis-je changer l'encodage de ce fichier en UTF-8? J'ai essayé jusqu'à présent la manière suivante:

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

Peut-être que je devrais utiliser extended ASCII( high ASCII) mais je ne le trouve pas dans iconvla liste de codage.

Patryk
la source
2
pouvez-vous télécharger le fichier quelque part?
janos
Il y a une liste pratique de 8 bits encodages ISO, côte à côte tous représentés, ici . L'un d'eux ressemble-t-il à ce que vous observez dans votre dossier? Par exemple, si vous pensez que "sta³y" devrait être "stacy", alors trouvez quel encodage a un "c" pour quel que soit le code hexadécimal étrange dans ce mot.
John1024
Probablement dans 90% des cas, le «texte ASCII étendu non ISO» sera un fichier codé dans la page de codes Windows 1252 . "Il s'agit probablement du codage de caractères 8 bits le plus utilisé au monde." (Wikipédia). Essayez-le d'abord:iconv -f windows-1252 -t utf-8 file
nyov

Réponses:

33

file vous indique «Texte ASCII étendu non ISO» car il détecte qu'il s'agit de:

  • très probablement un fichier «texte» dû au manque de caractères de contrôle (valeurs d'octets 0–31) autres que les sauts de ligne;
  • «ASCII étendu» car il y a des caractères en dehors de la plage ASCII (valeurs d'octets ≥128);
  • «Non ISO» car il y a des caractères dans la plage 128–159 ( ISO 8859 réserve cette plage aux caractères de contrôle).

Vous devez déterminer dans quel codage ce fichier semble être. Vous pouvez essayer la reconnaissance automatique d' Enca . Vous devrez peut-être le pousser dans la bonne direction en lui indiquant dans quelle langue le texte est.

enca x.txt
enca -L polish x.txt

Pour convertir le fichier, passez l' -xoption:enca -L polish x.txt -x utf8 >x.utf8.txt

Si vous ne pouvez pas ou ne voulez pas utiliser Enca, vous pouvez deviner l'encodage manuellement. Un peu de regarder autour de moi m'a dit que c'est du texte polonais et que les mots sont trwały, stały, usuważ, donc nous cherchons une traduction où ³łet æż. Cela ressemble latin-2 ou latin-10 ou plus susceptibles (donné « non-ISO » CP1250 que vous visionnez comme latin1 . Pour convertir le fichier en UTF-8, vous pouvez utiliser recodage ou iconv .

recode CP1250..utf8 <x.txt >x.utf8.txt
iconv -f CP1250 -t UTF-8 <x.txt >x.utf8.txt
Gilles 'SO- arrête d'être méchant'
la source
Je ne comprends pas < x.txt > x.utf8.txtpourquoi utilisons-nous <et ensuite >? Comment ça marche?
Filip Bartuzi
@FilipBartuzi <et >effectuez la redirection d'entrée et de sortie respectivement .
Gilles 'SO- arrête d'être méchant'
1

Ouvrez le fichier texte avec gedit et dans la boîte de dialogue "Enregistrer sous ..", vous verrez l'encodage actuel.

gedit
la source
0

Avez-vous essayé de savoir quel encodage exact est x.txt? Vous obtiendrez une liste des encodages pris en charge avec

iconv --list

Parfois, il m'arrive que j'obtienne un décalage entre latin1 et utf8. Ensuite, il est souvent utile de le convertir de et vers utf8 et vice versa.


la source
0

J'ai créé un script de conversion automatisé à l'aide de la bibliothèque enca , je l'utilise sur mon NAS pour convertir des sous-titres en UTF-8 mais il pourrait être utilisé pour toute conversion automatisée

N'hésitez pas à utiliser :)

ÉDITER:

#!/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
la source