GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara mengkode ulang ke UTF-8 secara kondisional?

Pesan ini sudah cukup lama, tapi saya rasa saya dapat berkontribusi pada masalah ini :
Pertama buat skrip bernama 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

Anda dapat menggunakannya dengan cara ini :

recodeifneeded utf-8 file.txt

Jadi, jika Anda ingin menjalankannya secara rekursif dan mengubah semua pengkodean file *.txt menjadi (katakanlah) utf-8 :

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

Saya harap ini membantu.


Skrip ini, diadaptasi dari ide harrymc, yang mengkode ulang satu file secara kondisional (berdasarkan keberadaan karakter Skandinavia yang disandikan UTF-8 tertentu), tampaknya bekerja dengan baik untuk saya.

$ 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

(File pemrosesan batch tentu saja merupakan masalah sederhana misalnya for f in *txt; do recode-to-utf8.sh $f; done .)

Catatan :ini sepenuhnya tergantung pada file skrip itu sendiri menjadi UTF-8. Dan karena ini jelas merupakan solusi yang sangat terbatas yang cocok untuk jenis file apa yang kebetulan saya miliki, jangan ragu untuk menambahkan jawaban yang lebih baik yang memecahkan masalah dengan cara yang lebih umum.


UTF-8 memiliki aturan ketat tentang urutan byte mana yang valid. Artinya jika data bisa menjadi UTF-8, Anda akan jarang mendapatkan hasil positif palsu jika berasumsi bahwa itu adalah .

Jadi Anda dapat melakukan sesuatu seperti ini (dengan Python):

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')

Dalam skrip shell, Anda dapat menggunakan iconv untuk melakukan konversi, tetapi Anda memerlukan alat untuk mendeteksi UTF-8. Salah satu caranya adalah dengan menggunakan iconv dengan UTF-8 sebagai penyandian sumber dan tujuan. Jika file tersebut valid UTF-8, keluarannya akan sama dengan masukan.


Linux
  1. Cara Mengonversi File ke Encoding UTF-8 di Linux

  2. Bagaimana cara membuat file jarang?

  3. Cara grep \n dalam file

  1. Bagaimana Cara Menghapus Bom Dari File Utf-8?

  2. Bagaimana Mengganti Nama File di Linux?

  3. Cara mengurutkan file di tempat

  1. Bagaimana Mengelola Kemampuan File Linux

  2. Bagaimana cara mendeteksi jika suatu file memiliki BOM UTF-8 di Bash?

  3. Bagaimana cara menyalin file secara transaksional?