1. ホーム
  2. unicode

[解決済み] Windowsのコマンドラインでunicode文字を使うには?

2022-03-17 11:15:26

質問

Team Foundation Server (TFS) のプロジェクトに、非英語文字 (š) が含まれています。ビルドに関連するいくつかのスクリプトを作成しようとしたところ、ある問題に行き当たりました。 š の文字がコマンドラインツールに表示されます。コマンドプロンプトや何やらはそれを台無しにしてしまい tf.exe ユーティリティで指定されたプロジェクトが見つからない。

.batファイルのフォーマットを変えてみました(ANSI、UTF-8で BOM また、JavaScript(本来はUnicode)でスクリプトを記述することもできますが、うまくいきません。プログラムを実行し、そのプログラムに ユニコード コマンドラインは?

解決方法は?

私の経歴です。私は何年もコンソールでユニコードの入出力を使っています(そして毎日たくさんやっています。さらに、私はまさにこのタスクのためのサポートツールを開発しています)。以下の事実/制限を理解する限り、問題はほとんどありません。

  • CMD と "コンソール "は無関係の要素です。 CMD.exe は、コンソールの中で「動作」するように準備されたプログラム(「コンソールアプリケーション」)のひとつに過ぎません。
  • AFAIK CMD はUnicodeを完全にサポートしています。 任意の コードページが有効です。
  • Windowsのコンソールには、Unicodeのサポートがたくさんありますが、完璧ではありません(「十分」なだけです。)
  • chcp 65001 は非常に危険です。 WindowsのAPIの欠陥を回避するために特別に設計されたプログラムでない限り(あるいは、これらの回避策を持つCランタイムライブラリを使用しない限り)、確実に動作することはないでしょう。 Win8では、これらの問題の1/2が cp65001 しかし、残りはWin10に適用されます。 .
  • で仕事をしています。 cp1252 . すでに申し上げたとおりです。 コンソールで Unicode を入出力する場合、コードページを設定する必要はありません。 .

詳細

  • コンソールに Unicode を読み書きするには、アプリケーション(またはその C ランタイム・ライブラリ)は、十分賢く File-I/O APIではなく Console-I/O APIを使用します。 (例として Pythonはどのようにそれを行うか .)
  • 同様に、Unicodeのコマンドライン引数を読むには、アプリケーション(またはそのCランタイム・ライブラリ)は、対応するAPIを使用するのに十分な賢さが必要です。
  • コンソールフォントのレンダリングは、BMPのUnicode文字にのみ対応しています(言い換えれば、以下は U+10000 ). 単純なテキストレンダリングのみがサポートされています (したがって、ヨーロッパ - およびいくつかの東アジア - 言語は、事前に合成されたフォームを使用する限り、問題なく動作するはずです)。 また 細則 東アジアと文字U+0000、U+0001、U+30FBについてはこちらをご覧ください] 。

実用上の注意点

  • その デフォルト のウィンドウズはあまり役に立ちません。 3つの設定を調整する必要があります。

    • 出力用:包括的なコンソールフォントを使用します。 最良の結果を得るために、私は マイビルド . (インストール方法はそこにあります。また、このページの他の回答にも記載されています)。
    • 入力用:キーボードレイアウトが可能なもの。 最良の結果を得るには、以下をお勧めします。 マイレイアウト .
    • 入力用です。 ユニコードのHEX入力を許可する .
  • コンソールアプリケーションへの「貼り付け」で、もう一つ厄介なことがあります(非常に技術的なことです)。

    • HEX入力で文字が配信されるのは KeyUpAlt ; すべて その他の文字の配信方法は KeyDown 多くのアプリケーションは、キャラクターを表示するために KeyUp . (を使用しているアプリケーションにのみ適用されます。 Console-I/O APIを使用します)。
    • 結論:多くのアプリケーションは、HEX入力イベントには反応しない。
    • さらに、「貼り付け」文字がどうなるかは、現在のキーボードレイアウトに依存します。もしその文字がプレフィックスキーを使わずに入力できる場合(ただし Ctrl-Alt-AltGr-Kana-Shift-Gray* この場合、エミュレートされたキー入力で配信されます。 そのため、このような文字だけを含むものを貼り付けることは問題ありません。
    • ただし、「その他」の文字が配信されるのは HEX入力のエミュレーション .

    結論 ただし、キーボードレイアウトが、プリフィックスキーなしで多くの文字の入力をサポートしている場合を除きます。 バグが多いアプリケーション を実行すると、文字がスキップされることがあります。 Paste をConsoleのUIで実行します。 Alt-Space E P . ( これは というわけで、私のキーボードレイアウトを使うことをお勧めします!)

また、Windows用の「代替となる『より高性能な』コンソール」も覚えておくとよいでしょう。 コンソールではありません . をサポートしていません。 Console-I/O APIのため、これらのAPIに依存して動作するプログラムは機能しないでしょう。 (「コンソールファイルハンドルへのファイルI/O API」のみを使用するプログラムは問題なく動作しますが)

このようなノンコンソールの一例として、MicroSoft社の Powershell . 私はこれを使用していません。 WinKey を入力し、次に powershell .


(一方で、以下のようなプログラムもあります。 ConEmu または ANSICON を傍受しようとするもので、より多くのことを行おうとします。 Console-I/O 真のコンソールアプリケーション」を動作させるためのAPIもあります。 これは、おもちゃのサンプルプログラムには間違いなく有効です。実際の生活では、これはあなたの特定の問題を解決するかもしれませんし、しないかもしれません。 実験してみてください)。

概要

  • フォント、キーボードレイアウトを設定します(オプションでHEX入力も可能です)。

  • を経由するプログラムのみを使用します。 Console-I/O API を使用し、Unicode のコマンドライン引数を受け付けます。 例えば、すべての cygwin -のコンパイルされたプログラムでも問題ないはずです。 すでに申し上げたように CMD も問題ありません。

UPDです。 のバグについて、当初は cp65001 カーネルとCRTLのレイヤーを混同していました( UPD²です。 とWindowsのユーザーモードAPI!)。 また Win8ではこのバグの半分が修正されました。「より良いコンソール」アプリケーションについてのセクションを明確にし、Pythonがどのようにそれを行うかについてのリファレンスを追加しています。