Wymuś kodowanie z US-ASCII do UTF-8 (iconv)

Próbuję transkodować kilka plików z US-ASCII do UTF-8.

Do tego używam iconv:

iconv -f US-ASCII -t UTF-8 file.php > file-utf8.php

Moje oryginalne pliki są zakodowane w US-ASCII, co sprawia, że konwersja nie ma miejsca. Najwyraźniej dzieje się tak dlatego, że ASCII jest podzbiorem UTF-8...

iconv US ASCII to UTF-8 lub ISO-8859-15

I cytując:

Nie ma potrzeby, aby plik tekstowy wyświetlał się inaczej, dopóki nie będzie zawierał ASCII postaciami są wprowadzono

Prawda. Jeśli wprowadzę do pliku znak nie-ASCII i zapiszę go, powiedzmy za pomocą Eclipse , kodowanie pliku (charset) zostanie zamienione na UTF-8.

W moim przypadku chciałbym wymusić na iconv transkodowanie plików do UTF-8. Czy nie ma w nim znaków innych niż ASCII, czy nie.

Uwaga: powodem jest mój kod PHP (pliki nie-ASCII...) ma do czynienia z jakimś ciągiem nie-ASCII, co powoduje, że ciągi nie są dobrze interpretowane "język francuski": {]}

Il à © tait une fois... l 'homme série animée mythique d' Albert

Barillé (Procidis), 1Ãre

...

  • US ASCII -- jest -- podzbiór UTF-8 (Zobacz odpowiedź Neda poniżej)
  • co oznacza, że pliki ASCII faktycznie zakodowane w UTF-8
  • mój problem pojawił się gdzieś indziej
Author: Peter Mortensen, 2012-07-03

10 answers

ASCII jest podzbiorem UTF-8, więc wszystkie pliki ASCII są już zakodowane w UTF-8. Bajty w pliku ASCII i bajty, które wynikałyby z "kodowania do UTF-8", byłyby dokładnie tymi samymi bajtami. Nie ma między nimi różnicy, więc nie ma potrzeby nic robić.

Wygląda na to, że twój problem polega na tym, że pliki nie są w rzeczywistości ASCII. Musisz określić, jakiego kodowania używają i odpowiednio transkodować.

 77
Author: Ned Batchelder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-03 01:39:14

Krótka Odpowiedź

  • file tylko zgaduje kodowanie pliku i może być błędne (szczególnie w przypadkach, gdy znaki specjalne pojawiają się późno tylko w dużych plikach).
  • możesz użyć hexdump, aby spojrzeć na bajty nie-7-bitowego tekstu ASCII i porównać z tabelami kodu dla wspólnych kodowań(ISO 8859 -*, UTF-8), aby samodzielnie zdecydować, jakie jest kodowanie.
  • iconv użyje dowolnego kodowania wejścia/wyjścia, które podasz, niezależnie od zawartości pliku. Jeśli podaj błędne kodowanie wejściowe, wyjście zostanie zniekształcone.
  • nawet po biegu iconv, file nie może zgłaszać żadnych zmian ze względu na ograniczony sposób, w jaki file próbuje odgadnąć kodowanie. Dla konkretnego przykładu, zobacz moją długą odpowiedź.
  • 7-bitowy ASCII (znany również jako US ASCII) jest identyczny na poziomie bajtów z UTF-8 i 8-bitowymi rozszerzeniami ASCII (ISO 8859-*). Więc jeśli Twój plik ma tylko 7-bitowe znaki, możesz nazwać go UTF-8, ISO 8859-* lub US ASCII, ponieważ na poziomie bajtów są one wszystkie są identyczne. Sensowne jest mówienie o UTF-8 i innych kodowaniach (w tym kontekście) tylko wtedy, gdy plik ma znaki spoza 7-bitowego zakresu ASCII.

Długa Odpowiedź

Wpadłam na to dzisiaj i natknęłam się na twoje pytanie. Być może mogę dodać trochę więcej informacji, aby pomóc innym ludziom, którzy napotkają ten problem.

ASCII

Po pierwsze, termin ASCII jest przeciążony, co prowadzi do zamieszania.

7-bitowy ASCII zawiera tylko 128 znaków (00-7F lub 0-127 w układzie dziesiętnym). 7-bitowe ASCII jest również czasami określane jako US-ASCII.

ASCII

UTF-8

Kodowanie UTF-8 używa tego samego kodowania co 7-bitowe ASCII dla pierwszych 128 znaków. Tak więc plik tekstowy, który zawiera tylko znaki z tego zakresu pierwszych 128 znaków, będzie identyczny na poziomie bajtów, bez względu na to, czy jest zakodowany w UTF-8, czy 7-bitowym ASCII.

układ strony kodowej

ISO 8859-* i inne ASCII Rozszerzenia

Termin Rozszerzony ASCII (lub wysoki ASCII) odnosi się do ośmiobitowego lub większego kodowania znaków, które zawiera standardowe siedmiobitowe znaki ASCII, plus dodatkowe znaki.

Rozszerzone ASCII

ISO 8859-1 (ISO Latin 1) - 8-bitowy standard rozszerzenia ASCII, który obejmuje większość znaków w Europie Zachodniej. Istnieją inne normy ISO dla języków wschodnioeuropejskich i cyrylicy języki. ISO 8859-1 zawiera znaki takie jak Ö, é, ñ i ß dla języka niemieckiego i hiszpańskiego.

"rozszerzenie" oznacza, że ISO 8859-1 zawiera 7-bitowy standard ASCII i dodaje do niego znaki za pomocą 8-bitowego. Tak więc dla pierwszych 128 znaków jest to równoważne na poziomie bajtów do plików zakodowanych w ASCII i UTF-8. Jednak, gdy zaczniesz radzić sobie z znakami poza pierwszą 128, nie są już równoważne UTF-8 na poziomie bajtów i musisz wykonać konwersję, jeśli chcesz, aby twój "Rozszerzony ASCII " plik do zakodowania w UTF-8.

ISO 8859 i dostosowania własne

Wykrywanie kodowania za pomocą file

Jedną z lekcji, której się dzisiaj nauczyłem, jest to, że nie możemy ufać file, aby zawsze podawać poprawną interpretację kodowania znaków pliku.

plik (polecenie)

Polecenie mówi tylko jak plik wygląda, a nie jak jest (w przypadku, gdy plik patrzy na zawartość). Łatwo jest oszukać program poprzez umieszczenie magicznej liczby w pliku, którego zawartość nie pasuje. W związku z tym polecenie nie może być użyte jako narzędzie bezpieczeństwa inne niż w określonych sytuacjach.

file szuka magicznych liczb w pliku, które podpowiedzą o typie, ale mogą być błędne, nie ma gwarancji poprawności. file próbuje również odgadnąć kodowanie znaków, patrząc na bajty w pliku. Zasadniczo file ma serię testów, które pomagają odgadnąć Typ pliku i kodowanie.

Mój plik to duży plik CSV. file zgłasza ten plik jako zakodowany w US ASCII, co jest błędne.

$ ls -lh
total 850832
-rw-r--r--  1 mattp  staff   415M Mar 14 16:38 source-file
$ file -b --mime-type source-file
text/plain
$ file -b --mime-encoding source-file
us-ascii

Mój plik ma umlauty w nim (ie Ö). Pierwsze nie-7-bitowe ascii pojawiają się dopiero po ponad 100k linii w pliku. Podejrzewam, że to dlatego file nie zdaje sobie sprawy, że kodowanie plików nie jest US-ASCII.

$ pcregrep -no '[^\x00-\x7F]' source-file | head -n1
102321:�

Jestem na Macu, więc używam PCRE grep. W GNU grep moĹźna uĹźyÄ ‡ opcji -P. Alternatywnie na Macu można zainstalować coreutils (via Homebrew lub inne) w celu uzyskania GNU grep.

Nie zagłębiłem się w kod źródłowy file, a strona podręcznika nie omawia detekcji kodowania tekstu w szczegółach, ale domyślam się, że file nie przegląda całego pliku przed odgadnięciem kodowania.

Jakiekolwiek jest kodowanie mojego pliku, te nie-7-bitowe znaki ASCII psują rzeczy. Mój niemiecki plik CSV jest ;-oddzielony i wyodrębnianie pojedynczej kolumny nie działa.

$ cut -d";" -f1 source-file > tmp
cut: stdin: Illegal byte sequence
$ wc -l *
 3081673 source-file
  102320 tmp
 3183993 total

Uwaga na cut błąd i że mój plik " tmp " ma tylko 102320 linii z pierwszym znakiem specjalnym w linii 102321.

Przyjrzyjmy się, jak te znaki nie-ASCII są kodowane. Wrzucam pierwsze nie-7-bitowe ascii do hexdump, robię małe formatowanie, usuwam nowe linie (0a) i biorę tylko kilka pierwszych.

$ pcregrep -o '[^\x00-\x7F]' source-file | head -n1 | hexdump -v -e '1/1 "%02x\n"'
d6
0a

Inny sposób. Wiem, że pierwszy nie-7-bitowy znak ASCII znajduje się na pozycji 85 na linii 102321. Chwytam tę linię I mówię hexdump, aby wziąć dwa bajty zaczynając od pozycji 85. Możesz zobaczyć specjalny (nie-7-bitowy-ASCII) znak reprezentowany przez ".", a następnym bajtem jest "M"... jest to więc kodowanie jednobajtowe.

$ tail -n +102321 source-file | head -n1 | hexdump -C -s85 -n2
00000055  d6 4d                                             |.M|
00000057

W obu przypadkach widzimy, że znak specjalny jest reprezentowany przez d6. Ponieważ znak ten jest literą Ö, która jest niemiecką literą, domyślam się, że ISO 8859-1 powinien to zawierać. Na pewno widać, że " d6 " pasuje (ISO / IEC 8859-1).

Ważne pytanie... skąd mam wiedzieć, że ta postać jest bez pewności co do kodowania plików? Odpowiedzią jest kontekst. Otworzyłem plik, przeczytałem tekst, a następnie ustaliłem, jaki ma być znak. Jeśli otwieram go w Vim wyświetla się jako Ö, ponieważ vim robi lepszą robotę zgadując kodowanie znaków (w tym przypadku) niż file robi.

Więc mój plik wydaje się być ISO 8859-1. Teoretycznie powinienem sprawdzić resztę nie-7-bitowych znaków ASCII, aby upewnić się, że ISO 8859-1 dobrze pasuje... Nie ma nic, co zmusza program do używania tylko jednego kodowania podczas zapisu pliku na dysk (inne niż dobre maniery).

Pominę czek i przejdę do kroku konwersji.
$ iconv -f iso-8859-1 -t utf8 source-file > output-file
$ file -b --mime-encoding output-file
us-ascii

Hmm. file nadal mówi mi, że ten plik jest nam ASCII nawet po konwersji. Sprawdźmy z hexdump Jeszcze raz.

$ tail -n +102321 output-file | head -n1 | hexdump -C -s85 -n2
00000055  c3 96                                             |..|
00000057
Zdecydowanie zmiana. Zauważ, że mamy dwa bajty nie-7-bitowego ASCII (reprezentowane przez "."po prawej), a kod szesnastkowy dla dwóch bajtów wynosi teraz c3 96. Jeśli spojrzymy, wydaje się, że mamy UTF-8 now (c3 96 jest kodowaniem Ö w UTF-8) UTF - 8 kodowanie tabel i znaków Unicode

Ale file nadal zgłasza nasze akta jako us-ascii? Cóż, myślę, że to wraca do punktu o file nie patrząc na cały plik i fakt, że pierwsze nie-7-bitowe znaki ASCII pojawiają się dopiero pod koniec pliku.

Użyję sed aby przykleić Ö na początku pliku i zobaczyć, co się stanie.

$ sed '1s/^/Ö\'$'\n/' source-file > test-file
$ head -n1 test-file
Ö
$ head -n1 test-file | hexdump -C
00000000  c3 96 0a                                          |...|
00000003

Super, mamy umlaut. Uwaga kodowanie to c3 96 (UTF-8). Hmm.

Sprawdzanie jeszcze raz naszych innych umlautów w tym samym pliku:

$ tail -n +102322 test-file | head -n1 | hexdump -C -s85 -n2
00000055  d6 4d                                             |.M|
00000057

ISO 8859-1. UPS! To tylko pokazuje, jak łatwo jest schrzanić kodowanie. Żeby było jasne, udało mi się stworzyć mieszankę kodowania UTF-8 i ISO 8859-1 w tym samym pliku.

Spróbujmy przekonwertować nasz nowy plik testowy za pomocą umlaut (Ö) z przodu i zobaczmy, co się stanie.

$ iconv -f iso-8859-1 -t utf8 test-file > test-file-converted
$ head -n1 test-file-converted | hexdump -C
00000000  c3 83 c2 96 0a                                    |.....|
00000005
$ tail -n +102322 test-file-converted | head -n1 | hexdump -C -s85 -n2
00000055  c3 96                                             |..|
00000057

UPS. Pierwszy umlaut, który był UTF-8 został zinterpretowany jako ISO 8859-1 ponieważ to właśnie powiedzieliśmy iconv. Drugi umlaut jest poprawnie konwertowany z d6 (ISO 8859-1) do c3 96 (UTF-8).

Spróbuję jeszcze raz, ale tym razem użyję Vima do wstawienia Ö zamiast sed. Vim wydawał się lepiej wykrywać kodowanie (jako" latin1 " aka ISO 8859-1), więc być może wstawi nowe Ö ze spójnym kodowaniem.

$ vim source-file
$ head -n1 test-file-2
�
$ head -n1 test-file-2 | hexdump -C
00000000  d6 0d 0a                                          |...|
00000003
$ tail -n +102322 test-file-2 | head -n1 | hexdump -C -s85 -n2
00000055  d6 4d                                             |.M|
00000057
Wygląda dobrze. Wygląda jak ISO 8859-1 dla nowych i starych umlautów. Teraz test.
$ file -b --mime-encoding test-file-2
iso-8859-1
$ iconv -f iso-8859-1 -t utf8 test-file-2 > test-file-2-converted
$ file -b --mime-encoding test-file-2-converted
utf-8
Boom! Moral of historia. Nie ufaj file, aby zawsze odgadnąć poprawne kodowanie. Łatwo jest mieszać kodowania w tym samym pliku. Gdy masz wątpliwości, spójrz na zaklęcie.

Hack (również podatny na awarie), który rozwiązałby to specyficzne ograniczenie file W przypadku dużych plików polegałoby na skróceniu pliku, aby upewnić się, że znaki specjalne (nie-ascii) pojawiają się na początku pliku, więc file jest bardziej prawdopodobne, aby je znaleźć.

$ first_special=$(pcregrep -o1 -n '()[^\x00-\x7F]' source-file | head -n1 | cut -d":" -f1)
$ tail -n +$first_special source-file > /tmp/source-file-shorter
$ file -b --mime-encoding /tmp/source-file-shorter
iso-8859-1

Można wtedy użyć (prawdopodobnie poprawnego) kodowania do feed jako wejście do iconv, aby upewnić się, że konwertujesz poprawnie.

Update

Christos Zoulas zaktualizował file, aby ilość bajtów była konfigurowalna. Jeden dzień turn-around na żądanie funkcji, niesamowite!

Http://bugs.gw.com/view.php?id=533 Zezwalaj na zmianę liczby bajtów do odczytania z analizowanych plików z linii poleceń

Funkcja została wydana w file wersji 5.26.

Patrząc na bardziej Duże plik zanim zgadniesz o kodowaniu wymaga czasu. Jednak dobrze jest mieć opcję dla konkretnych przypadków użycia, w których lepsze odgadnięcie może przeważyć dodatkowy czas i wejścia/Wyjścia.]}

Użyj następującej opcji:

−P, −−parameter name=value

    Set various parameter limits.

    Name    Default     Explanation
    bytes   1048576     max number of bytes to read from file
Coś w tym stylu...
file_to_check="myfile"
bytes_to_scan=$(wc -c < $file_to_check)
file -b --mime-encoding -P bytes=$bytes_to_scan $file_to_check

... powinno to zadziałać, jeśli chcesz zmusić file do obejrzenia całego pliku przed zgadnięciem. Oczywiście działa to tylko wtedy, gdy masz file 5.26 lub nowszy.

Zmuszanie file do wyświetlania UTF-8 zamiast US-ASCII

Niektóre inne odpowiedzi wydają się skupiać na próbie wyświetlenia UTF-8, nawet jeśli plik zawiera tylko zwykły 7-bitowy ascii. Jeśli to przemyślasz, prawdopodobnie nigdy nie powinieneś tego robić.

  1. Jeśli plik zawiera tylko 7-bitowe ascii, ale polecenie file mówi, że plik jest UTF-8, oznacza to, że plik zawiera niektóre znaki z kodowaniem UTF-8. Jeśli to nie jest prawda, może to spowodować zamieszanie lub problemy w dół linii. Jeśli file wyświetla UTF-8, gdy plik zawiera tylko 7-bitowe znaki ascii, byłby to błąd w programie file.
  2. każde oprogramowanie, które wymaga sformatowanych plików wejściowych UTF-8, nie powinno mieć problemu z używaniem zwykłego 7-bitowego ascii, ponieważ jest to takie samo na poziomie bajtów jak UTF-8. Jeśli istnieje oprogramowanie, które używa polecenia output file przed zaakceptowaniem pliku jako wejścia i nie przetworzy pliku, chyba że" zobaczy " UTF-8...to kiepski projekt. Argumentowałbym, że jest to błąd w tym programie.

Jeśli bezwzględnie musisz wziąć zwykły 7-bitowy plik ascii i przekonwertować go do UTF-8, po prostu włóż pojedynczy znak nie-7-bitowy ascii do pliku z kodowaniem UTF-8 dla tego znaku i gotowe. Ale nie wyobrażam sobie zastosowania, w którym musiałbyś to zrobić. Najprostszym do użycia znakiem UTF-8 jest znak kolejności bajtów(BOM) który jest specjalnym niedrukowalnym znakiem, który wskazuje, że plik nie jest ASCII. To jest prawdopodobnie najlepszy wybór, ponieważ nie powinien wpływać wizualnie na zawartość pliku, ponieważ na ogół będzie ignorowany.

Kompilatory i Interpretatory Microsoftu, oraz wiele elementów oprogramowania na Microsoft Windows takie jak Notatnik traktują BOM jako wymaganą magię liczba zamiast używać heurystyki. Te narzędzia dodają BOM podczas zapisywania tekst jako UTF-8 i nie może interpretować UTF-8, chyba że bom jest obecny lub plik zawiera tylko ASCII .

To jest klucz:

Lub plik zawiera tylko ASCII

Więc niektóre narzędzia w systemie windows mają problemy z odczytaniem plików UTF-8, chyba że znak BOM jest obecny. Nie ma to jednak wpływu na zwykłe 7-bitowe pliki ascii. Oznacza to, że nie jest to powód zmuszania zwykłych 7-bitowych plików ascii do UTF-8 przez dodanie znaku BOM.

Tutaj jest więcej dyskusji na temat potencjalnych pułapek korzystania z BOM, gdy nie jest to potrzebne (jest to potrzebne dla rzeczywistych plików UTF-8, które są zużywane przez niektórych Microsoft apps). https://stackoverflow.com/a/13398447/3616686

Niemniej jednak, jeśli nadal chcesz to zrobić, byłbym zainteresowany wysłuchaniem twojego przypadku użycia. Oto jak. W UTF-8 BOM jest reprezentowany przez sekwencję hex 0xEF,0xBB,0xBF, więc możemy łatwo dodać ten znak do przodu naszego zwykłego 7-bitowego pliku ascii. Dodając do pliku nie-7-bitowy znak ascii, plik nie jest już tylko 7-bitowym ascii. Zauważ, że nie zmodyfikowaliśmy ani nie przekonwertowaliśmy oryginalnego 7-bitowego ascii treść w ogóle. Dodaliśmy pojedynczy znak nie-7-bitowy ascii na początku pliku, więc plik nie jest już w całości złożony z 7-bitowych znaków ascii.

$ printf '\xEF\xBB\xBF' > bom.txt # put a UTF-8 BOM char in new file
$ file bom.txt
bom.txt: UTF-8 Unicode text, with no line terminators
$ file plain-ascii.txt  # our pure 7-bit ascii file
plain-ascii.txt: ASCII text
$ cat bom.txt plain-ascii.txt > plain-ascii-with-utf8-bom.txt # put them together into one new file with the BOM first
$ file plain-ascii-with-utf8-bom.txt
plain-ascii-with-utf8-bom.txt: UTF-8 Unicode (with BOM) text
 46
Author: mattpr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-12-04 10:03:59

Ludzie mówią, że nie możesz i rozumiem, że możesz być sfrustrowany, gdy zadajesz pytanie i otrzymujesz taką odpowiedź.

Jeśli naprawdę chcesz, aby wyświetlał się w UTF-8 zamiast W US ASCII, musisz to zrobić w dwóch krokach.

Pierwszy:

iconv -f us-ascii -t utf-16 yourfile > youfileinutf16.*

Drugi:

iconv -f utf-16le -t utf-8 yourfileinutf16 > yourfileinutf8.*

Jeśli wykonasz file -i, zobaczysz, że nowy zestaw znaków to UTF-8.

 18
Author: Mathieu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-11 19:59:24

Myślę, że Ned ma sedno problemu -- twoje pliki nie są w rzeczywistości ASCII. Try

iconv -f ISO-8859-1 -t UTF-8 file.php > file-utf8.php
Domyślam się, że używasz ISO 8859-1. Jest popularny w większości języków europejskich.
 12
Author: sarnold,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-11 18:42:41

Nie ma różnicy między ASCII a UTF-8, więc nie ma potrzeby go rekonwerterować.

Ale tutaj mała wskazówka, jeśli masz problemy z znakami specjalnymi podczas rekodowania.

Dodaj / / TRANSLIT po parametrze source-charset -.

Przykład:

iconv -f ISO-8859-1//TRANSLIT -t UTF-8 filename.sql > utf8-filename.sql

Pomaga mi to w dziwnych typach cudzysłowów, które zawsze przerywają proces ponownego kodowania zestawu znaków.

 2
Author: suther,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-11 19:33:59

Oto skrypt, który znajdzie wszystkie pliki pasujące do podanego wzorca, a następnie przekonwertuje je z bieżącego kodowania plików do UTF-8. Jeśli kodowanie jest US ASCII, to nadal będzie wyświetlane jako US ASCII, ponieważ jest to podzbiór UTF-8.

#!/usr/bin/env bash
find . -name "${1}" |
    while read line;
    do
        echo "***************************"
        echo "Converting ${line}"

        encoding=$(file -b --mime-encoding ${line})
        echo "Found Encoding: ${encoding}"

        iconv -f "${encoding}" -t "utf-8" ${line} -o ${line}.tmp
        mv ${line}.tmp ${line}
    done
 2
Author: Pytry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-11 20:00:49

Możesz użyć file -i file_name, aby sprawdzić, jaki dokładnie jest twój oryginalny format pliku.

Gdy już to dostaniesz, możesz zrobić:

iconv -f old_format -t utf-8 input_file -o output_file
 1
Author: user2830451,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-27 21:17:01

Przypadkowo zakodowałem plik w UTF-7 i miałem podobny problem. Kiedy wpisywałam file -i name.file dostałabym charset=us-ascii.

iconv -f us-ascii -t utf-9//translit name.file nie działa, ponieważ zebrałem UTF-7 jest podzbiorem US ASCII, podobnie jak UTF-8.

Aby to rozwiązać, wpisałem

iconv -f UTF-7 -t UTF-8//TRANSLIT name.file -o output.file

Nie jestem pewien, jak określić kodowanie inne niż to, co inni tu zasugerowali.

 1
Author: Schabry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-08-11 13:14:43

Poniższe konwertuje wszystkie pliki w folderze.

Utwórz folder kopii zapasowej oryginalnych plików .

mkdir backup

Konwertuj wszystkie pliki w kodowaniu US ASCII na UTF-8 (Komenda jednowierszowa)

for f in $(file -i * .sql | grep us-ascii | cut -d ':' -f 1); do iconv -f us-ascii -t utf-8 $f -o $ f.utf-8 && mv $f backup / && mv "$f.utf-8" $f; done

Konwertuj wszystkie pliki w kodowaniu ISO 8859-1 na UTF-8 (polecenie jednoliniowe)

for f $(file -i * .sql | grep iso-8859-1 | cut -d ':' -f 1); do iconv -f iso-8859-1 -t utf-8 $f -o $f.utf-8 && mv $f backup / && mv "$f.utf-8" $f; done
 0
Author: Marcelo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-11 20:03:39

Zainspirowany przez odpowiedź Mathieu i odpowiedź Marcelo :

Muszę zobaczyć file -i myfile.htm, aby pokazać UTF-8 zamiast US ASCII (tak, Wiem, że jest to podzbiór UTF-8).

Oto jeden liner zainspirowany poprzednimi odpowiedziami, które przekonwertują na Linuksie wszystkie *.plik htm z US ASCII do UTF-8 więc file -i pokaże Ci UTF-8. Możesz zmienić *.htm (dwa miejsca w poleceniu poniżej), aby dopasować się do Twoich potrzeb.

mkdir backup 2>/dev/null; for f in $(file -i *.htm | grep -i us-ascii | cut -d ':' -f 1); do iconv -f "us-ascii" -t "utf-16" $f > $f.tmp; iconv -f "utf-16le" -t "utf-8" $f.tmp > $f.utf8; cp $fic backup/; mv $f.utf8 $f; rm $f.tmp; done; file -i *.htm
 0
Author: Eric Duruisseau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-11 20:09:12