web-dev-qa-db-ja.com

バッチファイルエンコーディング

フランス語のéなど、奇妙な文字を含むファイル名を扱いたいです。

シェルではすべてが正常に機能しています。

C:\somedir\>ren -hélice hélice

この行を.batファイルに入れると、次の結果が得られます。

C:\somedir\>ren -hÚlice hÚlice

見る ? éはbyに置き換えられました。

コマンド出力についても同様です。シェルのdirディレクトリの場合、出力は正常です。この出力をファイルにリダイレクトすると、一部の文字が変換されます。

それでは、バッチファイルでéとして表示されるものを解釈する方法をcmd.exeに伝えるにはどうすればよいですか?

.batファイルを実行して、それが記述されたコードページに関するヒントを提供する方法はありませんか?

53
shodanex

OEMエンコードでバッチファイルを保存する必要があります。これを行う方法は、テキストエディタによって異なります。その場合に使用されるエンコードも異なります。西洋文化の場合、通常CP850です。

バッチファイルとエンコードは、実際には特に互いに好きではない2つのことです。残念ながら(環境変数がUnicodeをうまく処理していても)ユニコードを使用することもできません。

または、別のコードページを使用するようにコンソールを設定できます。

chcp 1252

トリックを行う必要があります。少なくとも、ここではうまくいきました。

dirなどを使用して出力のリダイレクトを行う場合、同じルールが適用されます。コンソールウィンドウのコードページが使用されます。 /uスイッチをcmd.exeに使用して、Unicode出力リダイレクトを強制することができます。これにより、結果のファイルはUTF-16になります。

cmd.exeのエンコードとコードページ全般については、次の質問もご覧ください。

EDIT:編集に関して:いいえ、cmdは常にバッチファイルがコンソールのデフォルトコードページに書き込まれると想定します。ただし、バッチの開始時にchcpを簡単に含めることができます。

chcp 1252>NUL
ren -hélice hélice

コマンドラインから直接使用するときにこれをより堅牢にするために、古いコードページを記憶し、後で復元することができます。

@echo off
for /f "tokens=2 delims=:." %%x in ('chcp') do set cp=%%x
chcp 1252>nul
ren -hélice hélice
chcp %cp%>nul
67
Joey

Rのコード内に洗練された兆候(例:ą、ę、ź、żなど)があり、。batファイルでこのRスクリプトを実行中の問題(代わりに出力ファイル.Routこれらの記号のうち、%、&、#などの記号があり、コードは最後まで実行されませんでした)。

私の解決策:

  1. エンコード付きRスクリプトを保存:ファイル>エンコード付き保存> CP125
  2. .batファイルを実行する

私にとってはうまくいきましたが、まだ問題がある場合は、他のエンコーディングを使用してみてください。

1
michal

私はこれで問題を抱えていましたが、ここに私が見つけた解決策があります。現在のコードページで探している文字の10進数を見つけます。

たとえば、私はコードページ437にいます(chcpからわかります)。度合記号が必要です。 http://en.wikipedia.org/wiki/Code_page_437 は、度数記号が248であることを示しています。

次に、同じ番号のUnicode文字を見つけます。

248(U + 00F8)のUnicode文字はです。

バッチスクリプトにUnicode文字を挿入すると、希望する文字としてコンソールに表示されます。

だから私のバッチファイル

echo

プリント

°
1
dconman

次のブロックを作成し、バッチファイルの先頭に配置しました。

set Filename=%0
IF "%Filename:~-8%" == "-850.bat" GOTO CONVERT_CODEPAGE_END
    rem Converting code page from 1252 to 850.
    rem My editors use 1252, my batch uses 850.
    rem We create a converted -850.bat file, and then launch it.
    set File850=%~n0-850.bat
    PowerShell.exe -Command "get-content %0 | out-file -encoding oem -filepath %File850%"
    call %File850%
    del %File850%
    EXIT /b 0
:CONVERT_CODEPAGE_END
1

私は3つの概念に関心があります:

  1. 出力コンソールのエンコーディング

  2. コマンドラインの内部エンコード(chcpで変更)

  3. .batテキストエンコーディング

私にとって最も簡単なシナリオ:CP850のように、最初の2つを同じエンコーディングで記​​述し、.batを同じエンコーディングで保存します(Notepad ++では、メニューEncoding文字セット西ヨーロッパ言語OEM 850)。

しかし、誰かがCP1252などの別のエンコーディングで.batを渡したと仮定します(Notepad ++では、メニューのエンコーディング*→Character sets西ヨーロッパ言語Windows-1252

次に、chcp 1252を使用して、コマンドラインの内部エンコードを変更します。

これにより、入力デバイスや出力コンソールではなく、他のプロセスと通信するために使用するエンコードが変更されます。

したがって、コマンドラインインスタンスは、STDOUTファイル記述子を介して1252の文字を効果的に送信しますが、コンソールが850(éはÚ)としてそれらをデコードすると、ギャブテキストが表示されます。

次に、ファイルを次のように変更します。

@echo off

Perl -e "use Encode qw/encode decode/;" -e "print encode('cp850', decode('cp1252', \"ren -hlice hlice\n\"));"
ren -hlice hlice

最初にエコーをオフにして、明示的にecho ...またはPerl -e "print ..."を実行しない限り、コマンドが出力されないようにします。

次に、何かを出力する必要があるたびにこの定型文を配置します

Perl -e "encode qw/encode decode /;を使用" -e "print encode( 'cp850'、decode( 'cp1252'、\" ren-hélicehélice\ n\"));"

これについては、実際に表示するテキストren-hélicehéliceに置き換えます。

また、コンソールエンコーディングをcp850に、他のサイドエンコーディングをcp1252に置き換える必要があります。

そして、すぐ下に目的のコマンドを配置します。

問題のある行を出力の半分と実際のコマンドの半分に分割しました。

  • 最初に確認します:「é」は、トランスコーディングによって「é」として解釈されます。コンソールとファイルのエンコーディングが異なるため、すべての出力センテンスに必要です。

  • 2番目のコマンド(@echo offでつぶやきます)は、chcpと.batテキストの両方で同じエンコードが行われていることを知っているため、適切な文字の解釈が保証されます。

1
g.cze