web-dev-qa-db-ja.com

WindowsのコマンドラインでUnicode文字を使用する方法

Team Foundation Server(TFS)に、英語以外の文字(š)を含むプロジェクトがあります。ビルド関連のいくつかのスクリプトを作成しようとしたときに問題が発生しました。コマンドラインツールにšの文字を渡すことはできません。コマンドPromptまたは他に何も混乱していない、およびtf.exeユーティリティは指定されたプロジェクトを見つけることができません。

私は、.batファイルのフォーマット(ANSI、UTF-8 BOM あり、なし)をJavaScriptでスクリプト化しました(これは本質的にUnicodeです) - しかし運が悪い。プログラムを実行し、それにUnicodeコマンドラインを渡す方法を教えてください。

292
Vilx-

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

  • CMDと「console」は無関係な要因です。 CMD.exeは、コンソールの内部で動作する準備ができているプログラムの1つです(「コンソールアプリケーション」)。
  • CMDはUnicodeを完璧にサポートしています。 any codepageがアクティブなときは、すべてのUnicode文字を入力/出力できます。
  • WindowsのコンソールはUnicodeをサポートしています - しかしそれは完璧ではありません(単に「十分」、下記参照)。
  • chcp 65001は非常に危険です。プログラムがWindowsのAPIの欠陥を回避するように特別に設計されていない限り(またはこれらの回避策があるCランタイムライブラリを使用していない限り)、それは確実には機能しません。 Win8はcp65001でこれらの問題の1/2を解決しましたが、それ以外は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のための 細かい活字 があります。

実用上の考慮事項

  • Windowのdefaultsはあまり役に立ちません。最高の経験のために、3つの設定を調整するべきです:

    • 出力用:包括的なコンソールフォント。最良の結果を得るために、私は 自分のビルド をお勧めします。 (インストール手順はそこにあります - そしてこのページの他の答えにもリストされています。)
    • 入力用:有能なキーボードレイアウト。最良の結果を得るために、私は 自分のレイアウト をお勧めします。
    • 入力の場合: Unicode の16進数入力を許可します。
  • コンソールアプリケーションへの「貼り付け」に関するもう1つの手がかり(非常に技術的):

    • HEX入力は、KeyUpAltに文字を渡します。 all その他の文字配送方法はKeyDownで起こります。非常に多くのアプリケーションはKeyUpの文字を見る準備ができていません。 (Console-I/O APIを使用しているアプリケーションにのみ適用されます。)
    • 結論:多くのアプリケーションはHEX入力イベントに反応しません。
    • さらに、「貼り付け」文字がどうなるかは、現在のキーボードレイアウトによって異なります。文字が接頭辞キーを使用せずに入力できる場合(ただし、Ctrl-Alt-AltGr-Kana-Shift-Gray*のように修飾子を任意の複雑な組み合わせで)入力できます。これがどんなアプリケーションでも期待していることなので、そのような文字だけを含むものを貼り付けるのは問題ありません。
    • ただし、「その他」の文字は、16進数入力をエミュレートするによって配信されます。

    まとめ :キーボードレイアウトがプレフィックスキーなしのA LOT文字の入力をサポートしていない限り、 バグのあるアプリケーション コンソールのUIでPasteをスキップすることがある:Alt-Space E P。 (Thisが私のキーボードレイアウトの使用をお勧めする理由です!)

また、Windows用の「代替的で「より有能な」コンソール」は、まったくコンソールではないであることにも留意する必要があります。これらはConsole-I/O APIをサポートしていないので、これらのAPIに依存して動作するプログラムは機能しません。 (ただし、コンソールファイルハンドルへの「ファイルI/O API」のみを使用するプログラムは問題なく動作します。)

そのような非コンソールの一例は、マイクロソフトのPowershellの一部です。私はそれを使わない;実験するには、WinKeyを押して放してからpowershellと入力します。


(一方、 ConEmuANSICON のような、もっとやろうとするプログラムがあります。それらはConsole-I/O APIを傍受しようとしますこれは玩具のサンプルプログラムには確かに機能します;実際には、これはあなたの特定の問題を解決するかもしれませんし、しないかもしれません。

概要

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

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

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

44

試してください:

chcp 65001

これはコードページをUTF-8に変更します。また、Lucidaのコンソールフォントを使う必要があります。

367
kgiannakakis

私は同じ問題を抱えていました(私はチェコ共和国出身です)。英語版のWindowsを使用していますが、共有ドライブ上のファイルを操作する必要があります。ファイルへのパスには、チェコ語固有の文字が含まれています。

私のために働く解決策は、次のとおりです。

バッチファイルで、文字セットページを変更します。

私のバッチファイル:

chcp 1250
copy "O:\VEŘEJNÉ\ŽŽŽŽŽŽ\Ž.xls" c:\temp

バッチファイルはCP 1250に保存する必要があります。

コンソールには文字が正しく表示されませんが、理解できます。

36
vanna

Unicode以外のプログラムの言語を確認してください。 Windowsコンソールでロシア語に問題がある場合は、ここでロシア語を設定してください。

Changing language for non-Unicode programs

25
Maxim Yefremov

Windowsコンソールのデフォルトのコードページを変更することは非常に困難です。あなたがウェブを検索するとき、あなたは異なった提案を見つけます、しかしそれらのいくつかはあなたの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"に置き換えます。

13

実際には、コマンドPromptは実際にはこれらの英語以外の文字を認識しますが、正しく表示することはできません。

英語以外の文字を含むコマンドプロンプトでパスを入力すると、「?? ?????? ?????」と表示されます。コマンドを送信すると(私の場合はcd "??? ?????? ?????")、すべて正常に機能しています。

12
User

Windows 10 x 64マシンでは、以下のコマンドを使用してコマンドプロンプトに英語以外の文字を表示させました。

昇格したコマンドプロンプトを開きます(管理者として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 ゴシック

今度は、Courier Newのようにあなたが必要とする文字をサポートするTrueTypeフォントを追加する必要があります。これを行うには、文字列名にゼロを追加します。この場合、次の1つは "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
10
Alon Or

私はPython 2.7に対する完全な答えを見たことがないので、2つの重要なステップと非常に有用なオプションのステップを概説します。

  1. あなたはUnicodeをサポートするフォントが必要です。 WindowsにはLucida Consoleが付属しています。これはコマンドプロンプトのタイトルバーを右クリックしてDefaultsオプションをクリックすることで選択できます。これは色へのアクセスも与えます。代わりにPropertiesを選択することで、特定の方法で呼び出されたコマンドウィンドウ(例:ここで開く、Visual Studio)の設定を変更することもできます。
  2. コードページをcp65001に設定する必要があります。これは、MicrosoftがプロンプトコマンドのUTF-7およびUTF-8サポートを提供しようとしているようです。これを行うには、コマンドプロンプトでchcp 65001を実行します。いったん設定されると、ウィンドウが閉じるまでこのままになります。 cmd.exeを起動するたびにこれをやり直す必要があります。

より恒久的な解決策については、スーパーユーザーで この答え を参照してください。つまり、REG_SZのregeditを使用してHKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor(String)エントリを作成し、AutoRunという名前を付けます。その値をchcp 65001に変更します。コマンドからの出力メッセージを見たくない場合は、代わりに@chcp 65001>nulを使用してください。

MinGWは意味のないエラーメッセージでコンパイルしている間に失敗する注目すべきものです。それにもかかわらず、これは非常にうまく機能し、プログラムの大部分にバグを引き起こすことはありません。

5
Aaron3468

1つの本当に簡単なオプションは MinGW のようなWindows bashシェルをインストールしてそれを使うことです:

Enter image description here

Unixのコマンドライン機能を使用する必要があるため、少し習熟する必要がありますが、その機能を気に入っていただけるので、コンソールの文字セットをUTF-8に設定できます。

Enter image description here

もちろん、grep、find、lessなどの通常の* nixグッズもすべて揃っています。

4
Steve Barnes

同様の問題として、(私の問題はMySQLからのUTF-8文字をコマンドプロンプトに表示することでした)、

私はこのように解決しました:

  1. コマンドプロンプトのフォントをLucida Consoleに変更しました。 (このステップはあなたの状況とは無関係でなければなりません。それはあなたがスクリーン上で見るものとだけ関係していて、本当にキャラクターであるものと関係していません).

  2. コードページをWindows-1253に変更しました。これは、 "Prompt by" chcp 1253 "コマンドで行います。 UTF-8を見たいという私の場合にはうまくいきました。

3
Christoforos

私はこの方法がWindows 10の新しいバージョンで有用であると感じました:

この機能をオンにします。「Beta:世界中の言語サポートにUnicode UTF-8を使用する」

「コントロールパネル」 - >「地域設定」 - >「管理」タブ - >「システムロケールの変更」.

Region Settings

2
zvi

この問題はかなり面倒です。私は通常私のファイル名とファイル内容に漢字があります。私はWindows 10を使用していることに注意してください、これが私の解決策です:

Windows 10にUbuntu bashをインストールした場合、dirlsなどのファイル名を表示するには

  1. UTF-8以外の文字をサポートするようにリージョンを設定します。

  2. その後、コンソールのフォントはそのロケールのフォントに変更され、コンソールのエンコーディングも変更されます。

コマンドラインツールを使用してUTF-8ファイルのファイルの内容を表示するために、前の手順を実行した後

  1. chcp 65001でページをutf-8に変更
  2. Lucida Consoleなど、utf-8をサポートするフォントに変更します。
  3. typeコマンドを使用してファイルの内容を確認します。Windows10にUbuntu bashをインストールした場合はcatを使用します。
  4. コンソールのエンコーディングをutf-8に設定した後、中国語の入力方法を使用してcmdに中国語の文字を入力することはできません。

最も怠惰な解決策: http://cmder.net/ のようなコンソールエミュレータを使うだけです。

2
code4j

もっとすっきりしたこと:利用可能な無料のMicrosoft日本語言語パックをインストールするだけです。 (他のオリエンタル言語パックも動作するでしょうが、私は日本語のものをテストしました。)

これにより、フォントのグリフセットが大きくなり、それらがデフォルトの動作になり、cmd、ワードパッドなどのさまざまなWindowsツールが変更されます。

1
Mike Beckerle

2019年6月から、Windows 10では、コードページを変更する必要はありません。

Windows端末の紹介 」(from Kayla Cinnamon )および Microsoft/Terminal
Consolasフォントを使用することで、部分Unicodeサポートが提供されます。

Microsoft/Terminal issue 387 に記載されているように、

現在Unicodeには87,887の表意文字があります。あなたもそれらのすべてが必要ですか?
境界が必要で、その境界を超えた文字はフォントフォールバック/フォントリンク/その他なら何でも扱うべきです。

Consolasがカバーすべきこと

  • CLIで最新のOSSプログラムで使用されている記号として使用されている文字。
  • これらのキャラクターは、Consolasのデザインと測定基準に従い、既存のConsolasのキャラクターと正しく一致させる必要があります。

Consolasがカバーすべきではないもの:

  • ラテン文字、ギリシャ文字、キリル文字を超えた文字や句読点、特に文字は複雑な形を必要とします(アラビア語のように)。
  • これらの文字はフォントフォールバックで処理する必要があります。
1
VonC

コードページを1252に変更するとうまくいきます。私にとっての問題は、Windows Server 2008上でDOSによってシンボルダブルドローラーが別のシンボルに変換されていることです。

私は私のBCPステートメントでそれの前にCHCP 1252と上限を使用しました^§。

1
madhav bitra

あなたのコンピュータがDOSウィンドウでそれをタイプするとき正しいあなたのパス/ファイル名を表示するならば、.batファイルのための迅速な決定:

  1. コピーcontemp.txt[Enterキーを押す]
  2. パス/ファイル名を入力してください[Enter]
  3. Ctrl-Zを押す[Enterを押す]

このようにして、.txtファイル - temp.txtを作成します。メモ帳で開いて、テキストをコピーし(判読不能に見えることを心配しないでください)、それをあなたの.batファイルに貼り付けます。このようにして作成された.batをDOSウィンドウで実行すると、m(Cyrillic、Bulgarian)にはうまくいきました。

1
S. Hristov

私はここでいくつかの答えを見ますが、それらは質問に対処するようには思われません - ユーザはコマンドラインからUnicode入力を得たいと思います。

Windowsは2バイト文字列のエンコードにUTF-16を使用しているので、プログラムのOSからこれらを取得する必要があります。これを行うには2つの方法があります -

1)Microsoftには、mainがワイド文字配列を取ることを可能にする拡張機能があります。int wmain(int argc、wchar_t * argv []); https://msdn.Microsoft.com/ja-jp/library/6wd819wh.aspx

2)Windows APIを呼び出して、Unicode版のコマンドラインを取得します。wchar_twin_argv =(wchar_t)CommandLineToArgvW(GetCommandLineW()、&nargs); https://docs.Microsoft.com/ja-jp/windows/desktop/api/shellapi/nf-shellapi-commandlinetoargvw

特にあなたが他のオペレーティングシステムをサポートしているならば、これを読んでください: http://utf8everywhere.org 詳細情報。

1
Robert Boehne

私は、Unicodeファイルを短い(8ドット3)の名前でそれらをバッチファイルで参照することによって削除するという同様の問題を回避しました。

短い名前はdir /xを実行することで表示できます。明らかに、これは既に知られているUnicodeファイル名でのみ機能します。

0
Michael