
ファイルを読み込み、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
vim
ex
一部のファイルエンコーディングを自動的に検出して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でエンコードされることを意味します。
file
BOMがないと、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ファイルの他の問題を修正します。iconv
dos2unix
LC_ALL=C.UTF-8 dos2unix