GNU/Linux >> Znalost Linux >  >> Linux

Jak podmíněně překódovat do UTF-8?

Tato zpráva je poměrně stará, ale myslím, že mohu přispět k tomuto problému:
Nejprve vytvořte skript s názvem recodeifneeded :

#!/bin/bash
# Find the current encoding of the file
encoding=$(file -i "$2" | sed "s/.*charset=\(.*\)$/\1/")

if [ ! "$1" == "${encoding}" ]
then
# Encodings differ, we have to encode
echo "recoding from ${encoding} to $1 file : $2"
recode ${encoding}..$1 $2
fi

Můžete jej použít takto:

recodeifneeded utf-8 file.txt

Pokud jej tedy chcete spouštět rekurzivně a změnit všechna kódování souborů *.txt na (řekněme) utf-8 :

find . -name "*.txt" -exec recodeifneeded utf-8 {} \;

Doufám, že to pomůže.


Tento skript, upravený podle harrymcovy myšlenky, který podmíněně překóduje jeden soubor (na základě existence určitých skandinávských znaků kódovaných UTF-8), se mi zdá snesitelně dobrý.

$ cat recode-to-utf8.sh 

#!/bin/sh
# Recodes specified file to UTF-8, except if it seems to be UTF-8 already

result=`grep -c [åäöÅÄÖ] $1` 
if [ "$result" -eq "0" ]
then
    echo "Recoding $1 from ISO-8859-1 to UTF-8"
    recode ISO-8859-1..UTF-8 $1 # overwrites file
else
    echo "$1 was already UTF-8 (probably); skipping it"
fi

(Dávkové zpracování souborů je samozřejmě jednoduchá záležitost, např. for f in *txt; do recode-to-utf8.sh $f; done .)

Pozn. :to zcela závisí na tom, že samotný soubor skriptu je UTF-8. A protože toto je zjevně velmi omezené řešení vhodné pro to, jaké soubory náhodou mám, neváhejte přidat lepší odpovědi které problém řeší obecnějším způsobem.


UTF-8 má přísná pravidla o tom, které sekvence bajtů jsou platné. To znamená, že pokud data mohla pokud je UTF-8, málokdy dostanete falešné poplachy, pokud předpokládáte, že je .

Takže můžete udělat něco takového (v Pythonu):

def convert_to_utf8(data):
    try:
        data.decode('UTF-8')
        return data  # was already UTF-8
    except UnicodeError:
        return data.decode('ISO-8859-1').encode('UTF-8')

Ve skriptu shellu můžete použít iconv k provedení převodu, ale budete potřebovat prostředek pro detekci UTF-8. Jedním ze způsobů je použití iconv s UTF-8 jako zdrojovým i cílovým kódováním. Pokud byl soubor platný UTF-8, výstup bude stejný jako vstup.


Linux
  1. Jak udělat soubor řídký?

  2. Jak grep \nv souboru

  3. Jak zjistit, zda má soubor v Bash kusovník UTF-8?

  1. Jak převést soubory do kódování UTF-8 v Linuxu

  2. Jak odstranit Bom ze souboru UTF-8?

  3. Jak transakčně zkopírovat soubor?

  1. Jak spravovat možnosti souborů Linux

  2. Jak přejmenovat soubor v Linuxu?

  3. Jak třídit soubor na místě