Windows コマンドラインで Unicode 文字を使用するにはどうすればよいですか?
-
23-08-2019 - |
質問
Team Foundation Server (TFS) に英語以外の文字 (š) が含まれるプロジェクトがあります。ビルド関連のスクリプトをいくつか作成しようとすると、問題が発生しました。 š コマンドラインツールへの手紙。コマンドプロンプトか何かがそれを台無しにします、そして tf.exe ユーティリティは指定されたプロジェクトを見つけることができません。
.bat ファイルのさまざまな形式 (ANSI、UTF-8 の有無にかかわらず) を試してみました。 BOM) だけでなく、JavaScript (本質的に Unicode) でスクリプトを作成することもできますが、うまくいきません。プログラムを実行して渡すにはどうすればよいですか ユニコード コマンドライン?
解決
私の背景:私は長年コンソールでUnicode入力/出力を使用しています(そして毎日やります。さらに、まさにこのタスクのサポートツールを開発します)。次の事実/制限を理解する限り、問題はほとんどありません。
CMD
「コンソール」は無関係な要因です。CMD.exe
コンソール(「コンソールアプリケーション」)の「内部で作業」する準備ができているプログラムの1つです。- 私の知る限り、
CMD
Unicodeを完璧にサポートしています。すべてのUnicode Charsを入力/出力することができます どれか コードページはアクティブです。 - WindowsのコンソールにはUnicodeに多くのサポートがありますが、完璧ではありません(ただ「十分」だけです。以下を参照)。
chcp 65001
とても危険です。プログラムがWindowsのAPIの欠陥を回避するように特別に設計されていない限り(または、これらの回避策を備えたCランタイムライブラリを使用する)、確実に機能しません。 Win8は、これらの問題の半分を修正しますcp65001
, 、しかし、残りはまだwin10に適用されます.- 私は〜で働く
cp1252
. 。私がすでに言ったように: コンソールにユニコードを入力/出力するには、コードページを設定する必要はありません.
詳細
- コンソールにUnicodeを読み取り/書き込むには、アプリケーション(またはそのCランタイムライブラリ)が使用しないほどスマートである必要があります
File-I/O
API、しかしConsole-I/O
API。 (たとえば、参照してください Pythonはそれをどのように行いますか.) - 同様に、Unicodeコマンドライン引数を読み取るには、アプリケーション(またはそのCランタイムライブラリ)は、対応するAPIを使用するのに十分なスマートでなければなりません。
- コンソールフォントレンダリングは、BMPのUnicode文字のみをサポートします(言い換えれば:以下
U+10000
)。単純なテキストレンダリングのみがサポートされています(したがって、ヨーロッパ人、およびいくつかの東アジア語 - 言語は正常に機能するはずです - 存在するフォームを使用する限り)。 [aがあります マイナーファインプリント ここで東アジアとキャラクターの場合はu+0000、u+0001、u+30fb。
実用的な考慮事項
デフォルト 上のウィンドウはあまり役に立ちません。ベストエクスペリエンスのために、3つの構成を調整する必要があります。
- 出力用:包括的なコンソールフォント。最良の結果には、お勧めします 私のビルド. 。 (インストール手順はそこに存在します。また、このページの他の回答にもリストされています。)
- 入力用:有能なキーボードレイアウト。最良の結果には、お勧めします 私のレイアウト.
- 入力用: Unicodeの16進入力を許可します.
コンソールアプリケーションに「貼り付け」されたもう1つのゴッチャ(非常に技術的):
- HEX入力は、文字を配信します
KeyUp
のAlt
; 全て キャラクターを配信する他の方法は起こりますKeyDown
;非常に多くのアプリケーションがキャラクターを見る準備ができていませんKeyUp
. 。 (使用を使用するアプリケーションにのみ適用できますConsole-I/O
API。) - 結論:多くのアプリケーションは、HEX入力イベントで反応しません。
- さらに、「貼り付けられた」文字で起こることは、現在のキーボードレイアウトに依存します。プレフィックスキーを使用せずに文字を入力できる場合(ただし、修飾子の任意の複雑な組み合わせでは、
Ctrl-Alt-AltGr-Kana-Shift-Gray*
)次に、エミュレートキープレスで配信されます。これはどのアプリケーションが期待するかです。そのため、そのような文字のみを含むものを貼り付けることは問題ありません。 - ただし、「他の」文字は ヘックス入力をエミュレートします.
結論: :キーボードレイアウトがプレフィックスキーのない多くの文字の入力をサポートしていない限り、 いくつかのバギーアプリケーション あなたがいるときにキャラクターをスキップするかもしれません
Paste
コンソールのUI経由:Alt-Space E P
. (これ キーボードレイアウトを使用することをお勧めします!)- HEX入力は、文字を配信します
また、Windowsの「代替の「より有能な」コンソール」にも留意する必要があります。 コンソールではありません. 。彼らはサポートしていません Console-I/O
APIなので、これらのAPIに依存して機能するプログラムは機能しません。 (ただし、「ファイルI/O APIにコンソールファイルハンドル」を使用するプログラムは、正常に機能します。)
そのような非コンソールの一例は、マイクロソフトの一部です Powershell
. 。私はそれを使わない;実験、押し、リリースします WinKey
, 、次にタイプします powershell
.
(一方で、次のようなプログラムがあります ConEmu
また ANSICON
もっとやろうとする:彼らは傍受しようとする「試み」 Console-I/O
「真のコンソールアプリケーション」も機能するAPI。これは間違いなくおもちゃの例プログラムで機能します。実生活では、これはあなたの特定の問題を解決するかもしれないし、そうでないかもしれません。実験。)
概要
フォント、キーボードレイアウトを設定します(オプションでは、ヘックス入力を許可します)。
通過するプログラムのみを使用します
Console-I/O
API、およびUnicodeコマンドライン引数を受け入れます。たとえば、任意cygwin
- コンパイルされたプログラムは大丈夫なはずです。私がすでに言ったように、CMD
大丈夫です。
UPD: 最初は、バグの場合 cp65001
, 、私はカーネルとCRTLの層を混合していました(upd²: WindowsユーザーモードAPI!)。 また: Win8はこのバグの半分を修正します。 「Better Console」アプリケーションに関するセクションを明確にし、Pythonがどのように行うかについての参照を追加しました。
他のヒント
試す:
chcp 65001
コードページをUTF-8に変更します。また、Lucidaコンソールフォントを使用する必要があります。
私は同じ問題を抱えていました(私はチェコ共和国出身です)。 Windowsの英語インストールがあり、共有ドライブ上のファイルを使用する必要があります。ファイルへのパスには、チェコ固有の文字が含まれます。
私に役立つ解決策は次のとおりです。
バッチファイルで、charsetページを変更します
私のバッチファイル:
chcp 1250
copy "O:\VEŘEJNÉ\ŽŽŽŽŽŽ\Ž.xls" c:\temp
バッチファイルはCP 1250で保存する必要があります。
コンソールには文字が正しく表示されないことに注意してください。しかし、それはそれらを理解するでしょう...
非統合プログラムについては、言語を確認してください。 Windowsコンソールでロシア語に問題がある場合は、ここにロシア語を設定する必要があります。
Windowsコンソールのデフォルトのコードページを変更することは非常に困難です。 Webを検索すると、さまざまな提案が見つかりますが、それらのいくつかはWindowsを完全に壊す可能性があります。つまり、PCはもう起動しません。
最も安全なソリューションはこれです:レジストリキーに移動します HKEY_CURRENT_USER\Software\Microsoft\Command Processor
文字列値を追加します Autorun
= chcp 65001
.
または、最も一般的なコードページにこの小さなバッチスクリプトを使用することもできます。
@ECHO off
SET ROOT_KEY="HKEY_CURRENT_USER"
FOR /f "skip=2 tokens=3" %%i in ('reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage /v OEMCP') do set OEMCP=%%i
ECHO System default values:
ECHO.
ECHO ...............................................
ECHO Select Codepage
ECHO ...............................................
ECHO.
ECHO 1 - CP1252
ECHO 2 - UTF-8
ECHO 3 - CP850
ECHO 4 - ISO-8859-1
ECHO 5 - ISO-8859-15
ECHO 6 - US-ASCII
ECHO.
ECHO 9 - Reset to System Default (CP%OEMCP%)
ECHO 0 - EXIT
ECHO.
SET /P CP="Select a Codepage: "
if %CP%==1 (
echo Set default Codepage to CP1252
reg add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 1252>nul" /f
) else if %CP%==2 (
echo Set default Codepage to UTF-8
reg add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 65001>nul" /f
) else if %CP%==3 (
echo Set default Codepage to CP850
reg add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 850>nul" /f
) else if %CP%==4 (
echo Set default Codepage to ISO-8859-1
add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 28591>nul" /f
) else if %CP%==5 (
echo Set default Codepage to ISO-8859-15
add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 28605>nul" /f
) else if %CP%==6 (
echo Set default Codepage to ASCII
add "%ROOT_KEY%\Software\Microsoft\Command Processor" /v Autorun /t REG_SZ /d "@chcp 20127>nul" /f
) else if %CP%==9 (
echo Reset Codepage to System Default
reg delete "%ROOT_KEY%\Software\Microsoft\Command Processor" /v AutoRun /f
) else if %CP%==0 (
echo Bye
) else (
echo Invalid choice
pause
)
使用 @chcp 65001>nul
それ以外の chcp 65001
出力「アクティブコードページ:65001」を抑制します。新しいコマンドラインウィンドウを起動するたびに取得できます。
あなたが得ることができるすべての利用可能な番号の完全なリスト コードページ識別子
注意してください、設定は現在のユーザーにのみ適用されます。すべてのユーザーに設定したい場合は、行を交換してください SET ROOT_KEY="HKEY_CURRENT_USER"
に SET ROOT_KEY="HKEY_LOCAL_MACHINE"
実際、コマンドプロンプトが実際にこれらの非英語キャラクターを理解しているため、正しく表示できないことです。
いくつかの英語のクラクターを含むコマンドプロンプトにパスを入力すると、「??????? ?????」として表示されます。私の場合、コマンド(CD "?????????」を送信すると、すべてが期待どおりに機能しています。
Windows 10 X64マシンで、コマンドプロンプト表示以外のキャラクターを表示しました。
昇格したコマンドプロンプトを開きます(管理者としてCMD.EXEを実行)。利用可能なTrueTypeフォントのレジストリをコンソールに照会します。
REG query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont"
次のような出力が表示されます。
0 REG_SZ Lucida Console
00 REG_SZ Consolas
936 REG_SZ *新宋体
932 REG_SZ *MS ゴシック
ここで、必要なキャラクターをサポートするTrueTypeフォントを追加する必要があります。ゼロを文字列名に追加することでこれを行います。この場合、次の場合は「000」になります。
REG ADD "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Console\TrueTypeFont" /v 000 /t REG_SZ /d "Courier New"
これで、UTF-8サポートを実装してください。
REG ADD HKCU\Console /v CodePage /t REG_DWORD /d 65001 /f
デフォルトのフォントを「Courier New」に設定します。
REG ADD HKCU\Console /v FaceName /t REG_SZ /d "Courier New" /f
フォントサイズを20に設定します:
REG ADD HKCU\Console /v FontSize /t REG_DWORD /d 20 /f
必要に応じてクイック編集を有効にします:
REG ADD HKCU\Console /v QuickEdit /t REG_DWORD /d 1 /f
Python 2.7の完全な回答は見たことがないので、2つの重要なステップと非常に便利なオプションのステップの概要を説明します。
- Unicodeサポートを備えたフォントが必要です。 WindowsにはLucidaコンソールが付属しています。 タイトルバーを右クリックします コマンドプロンプトとクリックの
Defaults
オプション。これにより、色にもアクセスできます。特定の方法で呼び出されたコマンドウィンドウの設定を変更することもできます(例えば、ここから開く、ビジュアルスタジオ)Properties
代わりは。 - コードページをに設定する必要があります
cp65001
, 、これは、コマンドプロンプトにUTF-7およびUTF-8サポートを提供しようとするMicrosoftの試みのようです。実行してこれを行いますchcp 65001
コマンドプロンプト. 。設定すると、窓が閉じるまでこのように残ります。 CMD.exeを起動するたびにこれをやり直す必要があります。
より永続的な解決策については、参照してください この答え スーパーユーザーについて。要するに、aを作成します REG_SZ
(文字列)regeditを使用したエントリ HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor
そしてそれに名前を付けます AutoRun
. 。その価値を変更します chcp 65001
. 。コマンドから出力メッセージを表示したくない場合は、使用してください。 @chcp 65001>nul
代わりは。
一部のプログラムは、このエンコードとの対話に問題があり、Mingwは無意味なエラーメッセージでコンパイル中に失敗する注目すべきものです。それにもかかわらず、これは非常にうまく機能し、プログラムの大部分でバグを引き起こしません。
本当に簡単なオプションは、次のようなWindowsバッシュシェルをインストールすることです Mingw そしてそれを使用してください:
UNIXコマンドラインの機能を使用する必要があるため、少し学習曲線がありますが、その力が気に入ってしまい、Console文字セットをUTF-8に設定できます。
もちろん、あなたはまた、Grep、Find、Lessなどのようなすべての通常の *nixグッズを取得します。
同様の問題については、私の問題は、コマンドプロンプトでMySQLのUTF-8文字を表示することでした)、
私はこのように解決しました:
コマンドプロンプトのフォントをLucidaコンソールに変更しました。 (このステップは、あなたの状況については無関係でなければなりません。それは、実際にキャラクターではなく、画面に表示されるものでのみ行わなければなりません)。
コードページをWindows-1253に変更しました。これを「CHCP 1253」でコマンドプロンプトで行います。 UTF-8を見たいと思っていた私の場合には機能しました。
この問題は非常に迷惑です。私は通常、ファイル名とファイルコンテンツに漢字を持っています。 Windows 10を使用していることに注意してください。ここに私の解決策があります。
を表示します ファイル名, 、 そのような dir
また ls
Windows 10にUbuntu Bashをインストールした場合
NonUTF 8文字をサポートするように地域を設定します。
その後、コンソールのフォントはそのロケールのフォントに変更され、コンソールのエンコードも変更されます。
以前の手順を実行した後、 ファイルコンテンツ コマンドラインツールを使用したUTF-8ファイルの
- ページをUTF-8に変更します
chcp 65001
- Lucidaコンソールなど、UTF-8をサポートするフォントに変更
- 使用する
type
ファイルコンテンツを覗くコマンド、またはcat
Windows 10にUbuntu Bashをインストールした場合 - コンソールのEncodingをUTF-8に設定した後、中国の入力方法を使用してCMDで漢字を入力できないことに注意してください。
最も怠zyなソリューション:次のようなコンソールエミュレータを使用するだけです http://cmder.net/
dos-windowで入力するときにパス/ファイル名を正しいコンピューターに表示する場合、.batファイルの簡単な決定:
- con temp.txtをコピーします Enterを押す
- パス/ファイル名を入力します[Enterを押します
- プレス Ctrl-Z Enterを押す
これにより、.txtファイル-Temp.txtを作成します。メモ帳でそれを開き、テキストをコピーし(読み取り不可能に見えることを心配しないでください)、.batファイルに貼り付けます。 .batを実行すると、この方法で作成されたDos-Windowで作成されました。
よりクリーンなこと:利用可能な無料のMicrosoft日本語パックをインストールするだけです。 (他のオリエンタル言語パックも機能しますが、日本の言語パックをテストしました。)
これにより、グリフの大きなセットを備えたフォントが得られ、デフォルトの動作、CMD、WordPadなどのさまざまなWindowsツールを変更します。
コードページを1252に変更することは私のために機能しています。私にとっての問題は、シンボルダーラー§がWindows Server 2008のDOSによって別のシンボルに変換されていることです。
私はBCPステートメントでCHCP 1252とその前にキャップを使用しました ^§。
ここにはいくつかの答えが表示されますが、質問に対処していないようです。ユーザーはコマンドラインからUnicode入力を取得したいと考えています。
WindowsはUTF-16を使用して2つのバイト文字列でエンコードするため、プログラムのOSからこれらを取得する必要があります。これを行うには2つの方法があります -
1)Microsoftには、メインが幅広い文字配列を取得できる拡張機能があります。 https://msdn.microsoft.com/en-us/library/6wd819wh.aspx
2)Windows APIを呼び出して、コマンドラインwchar_tのUnicodeバージョンを取得します win_argv =(wchar_t)commandlinetoargvw(getCommandLinew()、&nargs); https://docs.microsoft.com/en-us/windows/desktop/api/shellapi/nf-shellapi-commandlinetoargvw
これを読む: http://utf8everywhere.org詳細については、特に他のオペレーティングシステムをサポートしている場合。
2019年6月からWindows 10を使用して、コードページを変更する必要はありません。
見る "Windowsターミナルの導入" (から ケイラシナモン) そしてその マイクロソフト/ターミナル.
Consolasフォントの使用により、 部分的 Unicodeサポートが提供されます。
で文書化されているように Microsoft/Terminal
第387号:
現在Unicodeには87,887の表意図があります。あなたもそれらのすべてが必要ですか?
境界が必要であり、その境界を越えた文字は、フォントフォールバック /フォントリンク /何でも処理する必要があります。コンソーラがカバーすべきもの:
- CLIの最新のOSSプログラムで使用されるシンボルとして使用される文字。
- これらのキャラクターは、Consolasのデザインとメトリックに従い、既存のConsolasキャラクターと適切に整合する必要があります。
何がカバーすべきではないか:
- ラテン語、ギリシャ語、キリル語を超えて、特にキャラクターが複雑な形状(アラビア語など)を超えている文字と句読点のキャラクターと句読点。
- これらの文字は、フォントフォールバックで処理する必要があります。
バッチファイルで短い(8ドット3)の名前でそれらを参照することにより、Unicode-Namedファイルを削除する同様の問題を取り上げました。
短い名前は、実行することで表示できます dir /x
. 。明らかに、これはすでに既知のUnicodeファイル名でのみ機能します。
UTF-8へ: chcp 65001
デフォルトに戻る: chcp 437