Team Foundation Server(TFS)に、英語以外の文字(š)を含むプロジェクトがあります。ビルド関連のいくつかのスクリプトを作成しようとしたときに問題が発生しました。コマンドラインツールにšの文字を渡すことはできません。コマンドPromptまたは他に何も混乱していない、およびtf.exeユーティリティは指定されたプロジェクトを見つけることができません。
私は、.batファイルのフォーマット(ANSI、UTF-8 BOM あり、なし)をJavaScriptでスクリプト化しました(これは本質的にUnicodeです) - しかし運が悪い。プログラムを実行し、それにUnicodeコマンドラインを渡す方法を教えてください。
私の経歴:私は何年もの間コンソールでUnicodeの入出力を使用しています(そして毎日それをたくさんしています。さらに、私はまさにこのタスクのためのサポートツールを開発しています)。以下の事実/制限を理解している限り、問題はほとんどありません。
CMD
と「console」は無関係な要因です。 CMD.exe
は、コンソールの内部で動作する準備ができているプログラムの1つです(「コンソールアプリケーション」)。CMD
はUnicodeを完璧にサポートしています。 any codepageがアクティブなときは、すべてのUnicode文字を入力/出力できます。chcp 65001
は非常に危険です。プログラムがWindowsのAPIの欠陥を回避するように特別に設計されていない限り(またはこれらの回避策があるCランタイムライブラリを使用していない限り)、それは確実には機能しません。 Win8はcp65001
でこれらの問題の1/2を解決しましたが、それ以外はWin10 にも当てはまります。cp1252
で働いています。私がすでに言ったように:コンソールでUnicodeを入力/出力するために、コードページを設定する必要はありません。File-I/O
APIではなくConsole-I/O
APIを使用するのに十分スマートである必要があります。 (例として、Pythonがどのように動作するか を参照してください。)U+10000
の下)。単純なテキストレンダリングのみがサポートされています(したがって、ヨーロッパ言語や一部の東アジア言語では、あらかじめ作成されたフォームを使用している限りは問題ありません)。 [ここに東アジアと文字U + 0000、U + 0001、U + 30FBのための 細かい活字 があります。Windowのdefaultsはあまり役に立ちません。最高の経験のために、3つの設定を調整するべきです:
コンソールアプリケーションへの「貼り付け」に関するもう1つの手がかり(非常に技術的):
KeyUp
のAlt
に文字を渡します。 all その他の文字配送方法はKeyDown
で起こります。非常に多くのアプリケーションはKeyUp
の文字を見る準備ができていません。 (Console-I/O
APIを使用しているアプリケーションにのみ適用されます。)Ctrl-Alt-AltGr-Kana-Shift-Gray*
のように修飾子を任意の複雑な組み合わせで)入力できます。これがどんなアプリケーションでも期待していることなので、そのような文字だけを含むものを貼り付けるのは問題ありません。 まとめ :キーボードレイアウトがプレフィックスキーなしのA LOT文字の入力をサポートしていない限り、 バグのあるアプリケーション コンソールのUIでPaste
をスキップすることがある:Alt-Space E P
。 (Thisが私のキーボードレイアウトの使用をお勧めする理由です!)
また、Windows用の「代替的で「より有能な」コンソール」は、まったくコンソールではないであることにも留意する必要があります。これらはConsole-I/O
APIをサポートしていないので、これらのAPIに依存して動作するプログラムは機能しません。 (ただし、コンソールファイルハンドルへの「ファイルI/O API」のみを使用するプログラムは問題なく動作します。)
そのような非コンソールの一例は、マイクロソフトの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がそれをどのように行うかについての参照を追加しました。
試してください:
chcp 65001
これはコードページをUTF-8に変更します。また、Lucidaのコンソールフォントを使う必要があります。
私は同じ問題を抱えていました(私はチェコ共和国出身です)。英語版のWindowsを使用していますが、共有ドライブ上のファイルを操作する必要があります。ファイルへのパスには、チェコ語固有の文字が含まれています。
私のために働く解決策は、次のとおりです。
バッチファイルで、文字セットページを変更します。
私のバッチファイル:
chcp 1250
copy "O:\VEŘEJNÉ\ŽŽŽŽŽŽ\Ž.xls" c:\temp
バッチファイルはCP 1250に保存する必要があります。
コンソールには文字が正しく表示されませんが、理解できます。
Unicode以外のプログラムの言語を確認してください。 Windowsコンソールでロシア語に問題がある場合は、ここでロシア語を設定してください。
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"
に置き換えます。
実際には、コマンドPromptは実際にはこれらの英語以外の文字を認識しますが、正しく表示することはできません。
英語以外の文字を含むコマンドプロンプトでパスを入力すると、「?? ?????? ?????」と表示されます。コマンドを送信すると(私の場合はcd "??? ?????? ?????")、すべて正常に機能しています。
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
私はPython 2.7に対する完全な答えを見たことがないので、2つの重要なステップと非常に有用なオプションのステップを概説します。
Defaults
オプションをクリックすることで選択できます。これは色へのアクセスも与えます。代わりにProperties
を選択することで、特定の方法で呼び出されたコマンドウィンドウ(例:ここで開く、Visual Studio)の設定を変更することもできます。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は意味のないエラーメッセージでコンパイルしている間に失敗する注目すべきものです。それにもかかわらず、これは非常にうまく機能し、プログラムの大部分にバグを引き起こすことはありません。
1つの本当に簡単なオプションは MinGW のようなWindows bashシェルをインストールしてそれを使うことです:
Unixのコマンドライン機能を使用する必要があるため、少し習熟する必要がありますが、その機能を気に入っていただけるので、コンソールの文字セットをUTF-8に設定できます。
もちろん、grep、find、lessなどの通常の* nixグッズもすべて揃っています。
同様の問題として、(私の問題はMySQLからのUTF-8文字をコマンドプロンプトに表示することでした)、
私はこのように解決しました:
コマンドプロンプトのフォントをLucida Consoleに変更しました。 (このステップはあなたの状況とは無関係でなければなりません。それはあなたがスクリーン上で見るものとだけ関係していて、本当にキャラクターであるものと関係していません).
コードページをWindows-1253に変更しました。これは、 "Prompt by" chcp 1253 "コマンドで行います。 UTF-8を見たいという私の場合にはうまくいきました。
この問題はかなり面倒です。私は通常私のファイル名とファイル内容に漢字があります。私はWindows 10を使用していることに注意してください、これが私の解決策です:
Windows 10にUbuntu bashをインストールした場合、dir
やls
などのファイル名を表示するには
UTF-8以外の文字をサポートするようにリージョンを設定します。
その後、コンソールのフォントはそのロケールのフォントに変更され、コンソールのエンコーディングも変更されます。
コマンドラインツールを使用してUTF-8ファイルのファイルの内容を表示するために、前の手順を実行した後
chcp 65001
でページをutf-8に変更type
コマンドを使用してファイルの内容を確認します。Windows10にUbuntu bashをインストールした場合はcat
を使用します。最も怠惰な解決策: http://cmder.net/ のようなコンソールエミュレータを使うだけです。
もっとすっきりしたこと:利用可能な無料のMicrosoft日本語言語パックをインストールするだけです。 (他のオリエンタル言語パックも動作するでしょうが、私は日本語のものをテストしました。)
これにより、フォントのグリフセットが大きくなり、それらがデフォルトの動作になり、cmd、ワードパッドなどのさまざまなWindowsツールが変更されます。
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がカバーすべきではないもの:
- ラテン文字、ギリシャ文字、キリル文字を超えた文字や句読点、特に文字は複雑な形を必要とします(アラビア語のように)。
- これらの文字はフォントフォールバックで処理する必要があります。
コードページを1252に変更するとうまくいきます。私にとっての問題は、Windows Server 2008上でDOSによってシンボルダブルドローラーが別のシンボルに変換されていることです。
私は私のBCPステートメントでそれの前にCHCP 1252と上限を使用しました^§。
あなたのコンピュータがDOSウィンドウでそれをタイプするとき正しいあなたのパス/ファイル名を表示するならば、.batファイルのための迅速な決定:
このようにして、.txtファイル - temp.txtを作成します。メモ帳で開いて、テキストをコピーし(判読不能に見えることを心配しないでください)、それをあなたの.batファイルに貼り付けます。このようにして作成された.batをDOSウィンドウで実行すると、m(Cyrillic、Bulgarian)にはうまくいきました。
私はここでいくつかの答えを見ますが、それらは質問に対処するようには思われません - ユーザはコマンドラインから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 詳細情報。
私は、Unicodeファイルを短い(8ドット3)の名前でそれらをバッチファイルで参照することによって削除するという同様の問題を回避しました。
短い名前はdir /x
を実行することで表示できます。明らかに、これは既に知られているUnicodeファイル名でのみ機能します。