現在のOSのCodePageとロケールを手動で決定する方法


13

Windows OSの現在のコードページとロケールをユーザーに手動で検索させる方法はありますか?その情報を保存するレジストリ設定はありますか?

この手法がWindows 2000にまでさかのぼって機能する場合にも役立ちます。

回答:


16

chcpはアクティブなコードページを取得します。

systeminfoは、特にシステムロケールと入力ロケールを表示します。

" :このコマンドは(システム情報)は、Windows 2000で使用できませんが、することができますまだ2003コンピュータとセットリモートコンピュータのWindows 2000コンピュータにWindows XPまたはWindows上でこのコマンドを実行することにより、クエリのWindows 2000コンピュータの場合、これを実行し、現在のユーザーのログオン。コマンドはリモートマシン(ドメイン管理者など)で既に特権を持っているため、/ uおよび/ pを使用する必要はありません。」ここ
から。


1
chcpアクティブなOEMコードページが表示されることに注意してください。mklementが彼の答えで述べているように、Windowsで使用されている別のアクティブなコードページ、ANSIコードページが常にあります。詳細については、mklementの回答を参照してください。
kangalioo

6

特定のシステムには、以前はシステムロケールと呼ばれていた非Unicodeプログラムのlanguageという名前のレガシ設定によって決定される、関心のある2つのアクティブなコードページがあることに注意しください(背景情報については下のセクションを参照してください):

  • OEMのレガシーで使用するためのコード・ページコンソールアプリケーション、
  • ANSIのレガシーで使用するためのコード・ページのGUIアプリケーション。

注:コードページはさらに2つありますが、使用されることはほとんどないため、ここでは説明しません:EBCDICコードと(OS X以前の)Macコードページ-WinAPIのドキュメントを参照してください。

アクティブOEMコードページは、最も簡単に介して取得されるchcpに示すように、忘れられたセミコロンの役に立つ答え -それは明示的にセッションで変更されていなかったと仮定しますchcp <codePageNum>

アクティブなANSIコードページの決定はそれほど簡単ではありませんが、PowerShellはシステムロケールの名前と言語の決定にも役立ちます。

Windows 8+ / Windows Serverの2012+使用:Get-WinSystemLocaleコマンドレット:

Get-WinSystemLocale | Select-Object Name, DisplayName, 
                        @{ n='OEMCP'; e={ $_.TextInfo.OemCodePage } }, 
                        @{ n='ACP';   e={ $_.TextInfo.AnsiCodePage } }

注:[cultureinfo]::CurrentCulture.TextInfo.ANSICodePageたとえばを使用したくなるかもしれませが、これは必ずしもシステム全体のアクティブなANSIコードページを反映しているわけでありませ。代わりに、現在のユーザーのロケール(カルチャ)に関連付けられたANSIコードページであり、異なる場合があります。

米国英語システムでは、上記の結果は次のようになります。

Name  DisplayName             OEMCP  ACP
----  -----------             -----  ---
en-US English (United States)   437 1252

OEMCPOEMコードページ、ACPANSIコードページです。

Windows XPまでの古いシステムでも機能するレジストリベースの方法

# Get the code pages:
Get-ItemProperty HKLM:\SYSTEM\CurrentControlSet\Control\Nls\CodePage | 
     Select-Object OEMCP, ACP

米国英語システムでは、上記の結果は次のようになります。

OEMCP ACP 
----- --- 
437   1252

システムロケールの[フレンドリ] とLCID も取得する場合(LCIDは非推奨であることに注意してください):

[Globalization.CultureInfo]::GetCultureInfo([int] ('0x' + (
        Get-ItemProperty 'HKLM:\SYSTEM\CurrentControlSet\Control\Nls\Language' Default
      ).Default)
)

米国英語システムでは、上記の結果は次のようになります。

LCID             Name             DisplayName                                                                                                                                      
----             ----             -----------                                                                                                                                      
1033             en-US            English (United States)                                                                                                                          

背景情報

システムロケールは、非Unicodeプログラムの言語と呼ばれるようになったもの( NLSの用語を参照)のレガシー名であり、名前が示すとおり:

  • この設定は、レガシープログラム(Unicodeをサポートしないプログラム)にのみ適用されます

  • 特定のユーザーのロケール設定に関係なく、システム全体適用され、それを変更するには管理者権限が必要です。

これはレガシー設定であることに注意することが重要です。コードページ内部的にUnicodeを使用し、Windows APIのUnicodeバージョンを呼び出すプログラムには適用されなくなるためです

特に、アクティブなコードページ、つまりデフォルトで使用される文字エンコーディングを決定します

  • ANSIコードページを使用するUnicode対応でないプログラムは、Windows APIの非Unicode(ANSI)バージョン、の特にANSIバージョンを呼び出すときTextOut、特にUnicodeにしてから、文字列を変換するための機能、プログラムの文字列がでレンダリング方法を決定しますGUI

  • に反映されるようにコンソールウィンドウでデフォルトアクティブにするOEMコードページchcp

    • コンソールウィンドウのアクティブなコードページコンソールアプリケーションからのキーボード入力および出力の解釈および表示方法を決定します
      • これは、Unicodeコンソールアプリケーションからの出力もアクティブなコードページに変換されるため、情報が失われる可能性があることに注意してください。65001UnicodeのUTF-8エンコーディングを表す擬似コードページの使用は解決策ですが、レガシーコマンドラインプログラムがデータを誤って解釈し、失敗することさえあります-詳細については、このStackOverflowの回答を参照してください。
    • ANSIコードページとは異なり、あなたがすることができます与えられたコンソールウィンドウの需要に積極的[OEM]コードページを変更します。たとえば、OEMコードページに切り替えるには850、で実行chcp 850cmd.exe$OutputEncoding = [console]::InputEncoding = [console]::OutputEncoding = [text.encoding]::GetEncoding(850)PowerShell で実行します。
  • さらに、めったに使用されないEBCDICおよびMacコードページ。

レガシー用語で使用される単語ロケールと現在の用語での単語言語にもかかわらず:

  • のみ設定によって制御態様は、アクティブなコードページのセットとデフォルトのビットマップフォントも、(ユーザーレベルのロケール設定によって制御される)ロケールの他の要素ではありません。

  • 通常、特定のコードページは多くのロケールで共有され、複数の言語をカバーしています。たとえば、広く使用されている1252コードページは、英語を含む多くの西ヨーロッパ言語で使用されています

あなたがコントロールパネルから設定を変更してくださいしかし、あなたは設定を選んでやるの方法により、特定のロケール。

すべてのWindowsコードページのリストについては、https://docs.microsoft.com/en-us/windows/desktop/Intl/code-page-identifiersを参照してください


GetACP()関数-technet.microsoft.com/en-us/dd318070-これは興味深いリンクです。注釈セクションは、この関数の戻り値はユーザーが選択したデフォルトの入力言語とGUI言語ではなく、まったく異なるものであることを示しています...
Arioch '

確かに、@ Arioch'The -それは私が背景情報セクションで明らかにすることを試みたものです:システムロケール()コードページ(ただし、他のロケール設定)を決定するシステム全体を(b)に、関係なく、与えられたユーザーののロケール。リンクされたページの状態(強調が追加)に注意してください。「オペレーティングシステムの現在のWindows ANSIコードページ(ACP)識別子返します」。潜在的なAppLocaleのサードパーティの代替品については、回答へのリンクを追加しました。
mklement

1
GetACPのコメント/リンクは、MBCSからUnicodeへのデフォルトの変換が、一部のWindowsバージョンの実装の詳細だけでなく、ユーザーに依存せず、OS全体を対象とすることを確認する「神の言葉」の確認として重要だと思います。
アリオク

1
おそらく今日では、UNIX以前のMACとEBCDICの両方が、「歴史的に重要なものだけ」のニッチに等しく属します。しかし、私はそのMAC CPに多少の執着があり、UNIXとDOS-Win-OS / 2ツリーの両方とは異なり、プレーンテキストファイルに新しい行をマークする別のバリ​​アントを作成することができました。私が記憶したエキゾチックなコーナーケースでした。
アリオク

1
ありがとう。より多くのトピックリンク-docs.microsoft.com/en-us/windows/desktop/Intl/…-EBCDIC が「Windows 2000」とマークされているため、w2k以前はおそらく存在しなかったため、その後何年も誰も気にしませんでした使用したヘッダー変換ソースを更新します:-D
Arioch


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.