fileコマンドに従ってファイルをutf-8に変換します。

fileコマンドに従ってファイルをutf-8に変換します。

ファイルを読み込み、sqlldrを使用してデータをデータベースにアップロードするアップロードプロセスがあります。 sqlldrがファイルを処理している間に無効な数字の問題があります。ファイルがUTF-16にあることを確認し、メモ帳++からUTF-8に変換すると正常に動作し始めました。さて、以下のように体系的に変換してみたいと思います。

iconv -f UTF-16 -t UTF-8 file_name >output_file_name

ファイルのエンコーディングが異なる場合があるので、変換する前にファイルのエンコーディングを参照して、そのエンコーディングに基づいて変換したいと思います。たとえば、fileコマンドを使用して以下からUTF-16のみを読み込み、-fオプションと一緒に使用します。

bash-4.2$ file "/FILE_UPLOADS/Relationship (4).txt"
/FILE_UPLOADS/Relationship (4).txt: Little-endian UTF-16 Unicode text, with CRLF line terminators

どうすればいいですか?

答え1

vimex一部のファイルエンコーディングを自動的に検出してUTF-8に変換できるため、次のモードでファイル処理を試すことができます。

vim --clean -E -s -c 'argdo set fileencoding=utf-8 nobomb | update' -c q -- *.txt

updateまた、このプロセス中に変更されたファイルのみを再作成します。

答え2

file -iファイルのMIMEエンコーディングを返すを使用できます。

それは次のとおりです。

iconv -f `file -i $file|grep -Po 'charset=\K.*'` -t UTF-8 $file > $file_converted

別のアプローチは、次のようなより専門的なツールを使用することです。
https://gitlab.freedesktop.org/uchardet/uchardet
これにより、コマンドがより簡単になります。

iconv -f `uchardet $file` -t UTF-8 $file > $file_converted

しかし、インストールする必要があります。

答え3

いつfile話すべきですか?リトルエンディアンUTF-16 Unicodeテキストまたは--mime-encoding UTF-16LEこれは、ファイルがリトルエンディアン順序であることを示すBOMとともに、ファイルがUTF-16でエンコードされることを意味します。

fileBOMがないと、UTF-16テキストファイル(リトルまたはビッグエンディアン)を検出できません。

UTF-16テキストの場合は、最初の2バイトが0xff、0xfe(リトルエンディアン)、または0xfe 0xff(ビッグエンディアン)である必要があり、データの最初の64KiBの残りの部分がテキストのように見えることを確認します(テキスト内の不要なUTFのみを探します)。ファイル - 16個のエンコードされたASCII制御文字)。

Toはiconvリトルutf-16leエンディアンUTF-16を表します。いいえBOM、utf-16は、ビッグエンディアンでもリトルエンディアンでも、BOMを持つutf-16を意味します。

file -b --mime-encodingしたがって、出力を次のように使用すると、~からcharsetを使用すると、iconv出力にUTF-8でエンコードされたBOMが表示されます。

ここでは、次のようなものが必要です。

encoding=$(file -b --mime-encoding - < "$file") &&
  case $encoding in
    (utf-16[bl]e) iconv -f UTF-16 < "$file" -t UTF-8 > "$newfile";;
    (us-ascii | utf-8) ;; # already utf-8
    (*) printf >&2 '%s\n' "don't know what to do with a $encoding encoding"
  esac

CRLFなどのMicrosoftファイルの場合。 (少なくとも現在のバージョン)をdos2unix使用してUTF-16を検出し、ロケールの文字セットに変換できる必要があります(出力に関係なくUTF-8になるようにするには)。 localeを実行します)CRLFをLFに変更し、Microsoftファイルの他の問題を修正します。iconvdos2unixLC_ALL=C.UTF-8 dos2unix

関連情報