[解決済み] Windowsのコマンドラインでunicode文字を使うには?
質問
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入力で文字が配信されるのは
KeyUp
のAlt
; すべて その他の文字の配信方法はKeyDown
多くのアプリケーションは、キャラクターを表示するためにKeyUp
. (を使用しているアプリケーションにのみ適用されます。Console-I/O
APIを使用します)。 - 結論:多くのアプリケーションは、HEX入力イベントには反応しない。
-
さらに、「貼り付け」文字がどうなるかは、現在のキーボードレイアウトに依存します。もしその文字がプレフィックスキーを使わずに入力できる場合(ただし
Ctrl-Alt-AltGr-Kana-Shift-Gray*
この場合、エミュレートされたキー入力で配信されます。 そのため、このような文字だけを含むものを貼り付けることは問題ありません。 - ただし、「その他」の文字が配信されるのは HEX入力のエミュレーション .
結論 ただし、キーボードレイアウトが、プリフィックスキーなしで多くの文字の入力をサポートしている場合を除きます。 バグが多いアプリケーション を実行すると、文字がスキップされることがあります。
Paste
をConsoleのUIで実行します。Alt-Space E P
. ( これは というわけで、私のキーボードレイアウトを使うことをお勧めします!) -
HEX入力で文字が配信されるのは
また、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がどのようにそれを行うかについてのリファレンスを追加しています。
関連
-
[解決済み] Windowsのコマンドラインに'which'に相当するものはありますか?
-
[解決済み] MySQLでコマンドラインを使用してSQLファイルをインポートするにはどうすればよいですか?
-
[解決済み] Bashでコマンドライン引数を解析するには?
-
[解決済み] Bashでコマンドの出力に変数を設定するにはどうすればよいですか?
-
[解決済み] 特定のUnicode文字を含むコメントでのJavaコードの実行が許可されているのはなぜですか?
-
[解決済み] MySQLでコマンドラインを使用してユーザーアカウントのリストを取得するにはどうすればよいですか?
-
[解決済み] WindowsのCMDで1行に2つのコマンドを実行するにはどうしたらいいですか?
-
[解決済み] コマンドラインから .bash_profile を再読み込みする方法は?
-
[解決済み] Windowsのコマンドラインからアプリケーションの終了コードを取得するにはどうすればよいですか?
-
[解決済み】rakeタスクにコマンドライン引数を渡す方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】このUnicode結合文字はどうなっているのか、どうすればフィルタリングできるのか?
-
[解決済み] エスケープ文字は何ですか?
-
[解決済み] ノンチャラクターU+FDD0~U+FDEFは何のためにあるのですか?
-
[解決済み] 時間」を表すUnicodeの文字は?
-
[解決済み] 人を表すユニコード記号は?
-
[解決済み] 真ん中の大きな弾丸を表すユニコード文字は何になるのでしょうか?
-
[解決済み] Windowsのコマンドラインでunicode文字を使うには?
-
[解決済み】Markdownの構文でディレクトリとファイル構造を表現する【終了しました
-
[解決済み】「検索」を表すユニコードグリフシンボルはありますか【終了しました
-
[解決済み] 実際に使われている非BMPのUnicode文字で最も多いものは何ですか?[クローズド]