文字セット間でテキストファイルを変換する最良の方法は?


526

文字セット間でテキストファイルを変換する最も速くて簡単なツールまたは方法は何ですか?

具体的には、UTF-8からISO-8859-15に、またはその逆に変換する必要があります。

すべてがうまくいきます:お好きなスクリプト言語のワンライナー、コマンドラインツール、またはOSやWebサイトなどのその他のユーティリティ。

これまでのベストソリューション:

Linux / UNIX / OS X / cygwinの場合:

  • Troels Arvinによって提案されたGnu iconv、フィルターとして最適に使用されます。それは普遍的に利用できるようです。例:

    $ iconv -f UTF-8 -t ISO-8859-15 in.txt > out.txt
    

    ベンが指摘したように、iconvを使用しオンラインコンバータがあります

  • ヌーのrecodeの手動による提案)Cheekysoft変換するインプレースで一つまたは複数のファイルを。例:

    $ recode UTF8..ISO-8859-15 in.txt
    

    これはより短いエイリアスを使用します:

    $ recode utf8..l9 in.txt
    

    Recodeは、さまざまな行末タイプとエンコーディング間の変換に使用できるサーフェスもサポートしています

    改行をLF(Unix)からCR-LF(DOS)に変換します。

    $ recode ../CR-LF in.txt
    

    Base64エンコードファイル:

    $ recode ../Base64 in.txt
    

    それらを組み合わせることもできます。

    Unixの行末でBase64エンコードされたUTF8ファイルを、Dosの行末でBase64エンコードされたLatin 1ファイルに変換します。

    $ recode utf8/Base64..l1/CR-LF/Base64 file.txt
    

Windows上のPowershellジェイBazuzi):

  • PS C:\> gc -en utf8 in.txt | Out-File -en ascii out.txt

    (ただし、ISO-8859-15はサポートされていません。サポートされている文字セットは、unicode、utf7、utf8、utf32、ascii、bigendianunicode、default、およびoemです。)

編集する

iso-8859-1サポートを意味しますか?「文字列」を使用すると、これが可能になります(その逆など)

gc -en string in.txt | Out-File -en utf8 out.txt

注:可能な列挙値は、「不明、文字列、ユニコード、バイト、BigEndianUnicode、UTF8、UTF7、ASCII」です。


私は試しましたgc -en Ascii readme.html | Out-File -en UTF8 readme.htmlが、ファイルをutf-8に変換しますが、それは空です!Notepad ++は、ファイルがAnsi形式であると言いますが、私が理解しているように、それは有効な文字セットでさえないと読みますか?uk.answers.yahoo.com/question/index?qid=20100927014115AAiRExF
OZZIE

2
関連する質問への答えを探してこれに出くわしてください-素晴らしい要約!recodeファイル名を渡さない場合もフィルターとして機能することを追加する価値があると思っただけです。例:recode utf8..l9 < in.txt > out.txt
Jez

iconv.com/iconv.htmは私にとって死んでいるようです?(タイムアウト)
Andrew Newby 2014年

2
を使用する場合enca、入力エンコーディングを指定する必要はありません。多くの場合、言語を指定するだけで十分ですenca -L ru -x utf8 FILE.TXT
Alexander Pozdneev、2015

1
実際、iconvはフィルターの代わりにインプレースコンバーターとしてはるかによく機能しました。200万行を超えるファイルを変換すると、iconv -f UTF-32 -t UTF-8 input.csv > output.csv約70万行、3分の1しか節約できませんでした。インプレースバージョンを使用すると、iconv -f UTF-32 -t UTF-8 file.csv200万以上の行がすべて正常に変換されました。
Nicolay77 2016年

回答:


246

スタンドアロンユーティリティアプローチ

iconv -f ISO-8859-1 -t UTF-8 in.txt > out.txt
-f ENCODING  the encoding of the input
-t ENCODING  the encoding of the output

これらの引数のいずれかを指定する必要はありません。デフォルトでは、現在のロケール(通常はUTF-8)が使用されます。


4
ダッシュ以外のバージョンが利用できなくなったことでつまずく人は、OSX(およびおそらくすべてのBSD)バージョンのiconvがさまざまなUTF- *エンコーディングのダッシュ以外のエイリアスをサポートしていないようです。 iconv -l | grep UTFあなたのiconvのコピーがサポートするすべてのUTF関連のエンコーディングを教えてくれます。
coredumperror

14
入力ファイルのエンコーディングがわかりませんか?chardet in.txt最良の推測を生成するために使用します。結果はでENCODINGとして使用できますiconv -f ENCODING
Stew

4
無効な文字での終了を防止し(illegal input sequence at positionメッセージを回避)、「奇妙な」文字を「類似した」文字で置き換えますiconv -c -f UTF-8 -t ISO-8859-1//TRANSLIT in.txt > out.txt
knb 2015

これはほとんどのNIXプラットフォームの標準であるため、これが好きです。:しかし、またVIMのコマンドオプション(別名を参照exを下回ります。追加情報:(1)(おそらく)で-f(from)オプションを指定する必要はありませんiconv。(2)file --mime-encoding <file/s>コマンドを使用すると、最初にエンコーディングを把握できます。
2013年

1
FWIW fileコマンドが私のソースをUTF-16リトルエンディアンとして報告しました。実行iconv -f UTF-16 -t UTF-8...すると、ASCIIに誤って変換さiconv -f UTF-16LE...
Plato

90

VIMを試す

あなたが持っている場合 vimならこれを使うことができます:

すべてのエンコーディングについてテストされていません。

これについてのクールな部分は、あなたがソースエンコーディングを知る必要がないということです

vim +"set nobomb | set fenc=utf8 | x" filename.txt

このコマンドはファイルを直接変更することに注意してください


説明部!

  1. +:ファイルを開くときにコマンドを直接入力するためにvimによって使用されます。通常、特定の行でファイルを開くために使用されます。vim +14 file.txt
  2. | :複数のコマンドの区切り文字( ; bashなど)
  3. set nobomb :utf-8 BOMなし
  4. set fenc=utf8:新しいエンコーディングをutf-8 ドキュメントリンクに設定
  5. x :ファイルを保存して閉じます
  6. filename.txt :ファイルへのパス
  7. ":パイプのため、引用はここにあります。(それ以外の場合、bashはそれらをbashパイプとして使用します)

かなりクールですが、やや遅いです。これを変更して一度に多数のファイルを変換する方法はありますか(vimの初期化コストを節約できます)?
DomQ 2016

説明ありがとうございます!爆弾/無爆弾の設定について読むまで、ファイルの冒頭で苦労していました。
jjwdesign 2016年

1
np、追加で使用する場合はbomを表示できます。vim -bまたはhead file.txt|cat -e
Boop

1
例:find -regextype posix-extended -type f -regex ".*\.(h|cpp|rc|fx|cs|props|xaml)" -exec vim +'set nobomb | set fenc=utf8 | x' {} \;
ガブリエル

これを使用してCSVファイルのエンコードを変換しましたが、文字セットが実際に変更されたのを見て、本当に興奮しました。残念ながら、ファイルをMySQLにロードしようとしたとき、vimコマンドを実行する前の列とは異なる列数がありました。他のすべてのファイルの内容を同じにしたまま、ファイルを開いてエンコードを変換し、ファイルを保存/閉じるだけで済むのではないでしょうか。
NightOwlPrgmr 2017

39

Linuxでは、非常に強力なrecodeコマンドを使用して、異なる文字セット間での変換や、行末の問題を試すことができます。recode -lは、ツールが変換できるすべての形式とエンコーディングを表示します。非常に長いリストになる可能性があります。


どのように変換しLFますか?ありません/CRし、/CR-LFしかし何の/LF
アーロンフランケ


20
Get-Content -Encoding UTF8 FILE-UTF8.TXT | Out-File -Encoding UTF7 FILE-UTF7.TXT

入力BOMが正しいと想定できる場合の最短バージョン:

gc FILE.TXT | Out-File -en utf7 file-utf7.txt

1
以下は、より適切に機能する短いバージョンです。gc .\file-utf8.txt | sc -en utf7 .\file-utf7.txt
ラリーバトル

@LarryBattle:どのようにSet-Contentより良い仕事をOut-File
Jay Bazuzi

...ああ。ほぼ同じだと思います。両方のバージョンがfile-utf8.txt同じ出力ファイルを持っているため、両方のバージョンが同じファイルを入力に使用していると想定していたため、サンプルの実行に問題がありましたfile-utf7.txt
ラリーバトル

これは、UTF16をサポートしないことを除いて、本当に素晴らしいでしょう。UTF32はサポートしていますが、UTF16はサポートしていません。ファイルを変換する必要はありません。ただし、多くのMicrosoftソフトウェア(SQL Server BCPを使用)はUTF16を要求しているため、ユーティリティは変換されません。控えめに言っても興味深い。
ノア

私は試しましたgc -en Ascii readme.html | Out-File -en UTF8 readme.htmlが、ファイルをutf-8に変換しますが、それは空です!Notepad ++は、ファイルがAnsi形式であると言いますが、有効な文字セットではないことを理解しているので読みますか?uk.answers.yahoo.com/question/index?qid=20100927014115AAiRExF
OZZIE

16

iconv Bash関数を試す

私はこれを入れました.bashrc

utf8()
{
    iconv -f ISO-8859-1 -t UTF-8 $1 > $1.tmp
    rm $1
    mv $1.tmp $1
}

..ファイルを次のように変換できるようにする:

utf8 MyClass.java

8
tmp = $(mktmp)を使用して一時ファイルを作成するのが適切です。また、rmの付いたラインは冗長です。
LMZ、2015

1
自動検出入力フォーマットでこの機能を完了することができますか?
mlibre

3
この関数は、iconv呼び出しが成功したことを確認せずに入力ファイルを削除することに注意してください。
philwalk 2017

これにより、テキストファイルの内容が変更されます。私はこれをBOMなしのUTF-8で取得することを期待してBOM付きのUTF-8で実行しましたが、ファイルの先頭に付加されました。
アーロンフランケ

14

Notepad ++を試す

Windowsでは、Notepad ++を使用してISO-8859-1からUTF-8への変換を行うことができました。クリック"Encoding"してから"Convert to UTF-8"


13

自動文字セット検出を備えた、findを使用したOneliner

一致するすべてのテキストファイルの文字エンコード自動的に検出され、一致するすべてのテキストファイルがutf-8エンコードに変換されます。

$ find . -type f -iname *.txt -exec sh -c 'iconv -f $(file -bi "$1" |sed -e "s/.*[ ]charset=//") -t utf-8 -o converted "$1" && mv converted "$1"' -- {} \;

これらのステップを実行するために、サブシェルshで使用される-execと、ワンライナーを実行して、-cフラグ、位置引数としてファイル名を渡す"$1"-- {}。その間、utf-8出力ファイルは一時的にと名付けられconvertedます。

これによりfile -bi

  • -b--brief 出力行にファイル名を付加しません(簡易モード)。

  • -i--mime fileコマンドに、従来の人間が読める形式ではなく、MIMEタイプの文字列を出力させます。したがって、それはたとえばtext/plain; charset=us-asciiではなく言うかもしれませんASCII textsedコマンドはこれをカットus-asciiなどにより必要とされますiconv

findコマンドは、ファイル管理の自動化のために非常に有用です。こちらをクリックして、よりfind豊富


3
少なくとも私のバージョンでは、Mac OS Xで動作するようにこのソリューションを少し調整する必要がありました。find . -type f -iname *.txt -exec sh -c 'iconv -f $(file -b --mime-encoding "$1" | awk "{print toupper(\$0)}") -t UTF-8 > converted "$1" && mv converted "$1"' -- {} \;
ブライアンJ.ミラー

1
あなたのコードはMinGW-w64(最新バージョン)を搭載したWindows 7でも動作しました。共有してくれてありがとう!
silvioprog

@rmuller sedコマンドは意図的に存在し、文字エンコーディングの自動検出を可能にします。私はこれを今説明するために答えを広げました。残りの無関係なコメントを削除することは読者に関して礼儀正しいでしょう。ありがとうございました。
Serge Stroobandt

@SergeStroobandt多分私は十分に明確ではなかった。私のポイントは、「file -bi」の代わりに「file -b --mime-encoding」を使用する場合、sedで結果をフィルタリングする必要がないことです。このコマンドはすでにファイルエンコーディングのみを返します。したがって、例では "us-ascii"
rmuller

Linuxでは、これは実際には何もしません。ファイルをBOM付きのUTF-8として保存しましたが、BOMなしのUTF-8に変換されるはずでしたが、変換されませんでした。
アーロンフランケ

3

PHP iconv()

iconv("UTF-8", "ISO-8859-15", $input);


1
このステートメントは、文字列を変換するときにうまく機能しますが、ファイルに対しては機能しません。
jjwdesign 2016年

2

DOS / Windows:コードページを使用

chcp 65001>NUL
type ascii.txt > unicode.txt

コマンドchcpを使用して、コードページを変更できます。コードページ65001は、UTF-8のマイクロソフト名です。コードページを設定すると、次のコマンドで生成される出力はコードページセットになります。


1

プロパティファイル(Java)を書き込むには、通常これをLinux(mintおよびubuntuディストリビューション)で使用します。

$ native2ascii filename.properties

例えば:

$ cat test.properties 
first=Execução número um
second=Execução número dois

$ native2ascii test.properties 
first=Execu\u00e7\u00e3o n\u00famero um
second=Execu\u00e7\u00e3o n\u00famero dois

PS:特殊文字を強制するために、実行番号1/2をポルトガル語で書きました。

私の場合、最初の実行で次のメッセージを受け取りました。

$ native2ascii teste.txt 
The program 'native2ascii' can be found in the following packages:
 * gcj-5-jdk
 * openjdk-8-jdk-headless
 * gcj-4.8-jdk
 * gcj-4.9-jdk
Try: sudo apt install <selected package>

最初のオプション(gcj-5-jdk)をインストールしたとき、問題は終了しました。

これが誰かを助けることを願っています。




0

このための私のお気に入りのツールは、2つの非常に便利な機能を持つJedit(Javaベースのテキストエディター)です。

  • ユーザーが別のエンコーディングでテキストを再読み込みできるようにする(したがって、結果を視覚的に制御できる)
  • 保存する前にユーザーがエンコード(および行末文字)を明示的に選択できるようにするもう1つの方法

0

現在の文字セットが示されているステータスバー(下部)の右側にあるIntelliJ IDEA IDEで読み込まれたファイルのエンコーディングを変更するだけです。リロードまたは変換を求められます。変換を使用します。事前に元のファイルをバックアップしてください。


0

macOS GUIアプリケーションがあなたのパンとバターなら、SubEthaEditは私が通常エンコーディングに使用するテキストエディターです。その「変換プレビュー」を使用すると、出力エンコーディングのすべての無効な文字を確認し、修正/削除できます。

そして、それは現在オープンソースなので、彼らにとってはいいですy。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.