たれながし.info

とあるITエンジニアの備忘録

Windowsでシステムロケールを確認する方法


はじめに

OSの言語環境によって動作が変わるアプリケーションが存在します。
例えば、ロシア製のマルウェアは、ロシア語環境のOSでは動作しないといったことがあるようです。

Windowsでは、アプリがOSの言語環境を判別する方法として「システムロケールを確認する」という方法があるようです(これ以外の方法もあると思います)。
ということで、「Windowsでシステムロケールを確認する方法」を調べてみました。

MSの公式文書でのシステムロケールの説明は以下にあります。
learn.microsoft.com

※ちなみに
Windowsの言語設定には「ユーザーロケール」「システムロケール」「入力ロケール」「キーボードロケール」etcと色々あるみたいですが、「システムロケール」がそのOSが利用されている言語環境を意味していると思って概ね問題ないのかな思います(特殊な利用環境でしか、それぞれを異なる設定にはしないと思われる)。

システムロケールの表記について

システムロケールは「[言語コード]-[国/地域コード]」という形で表現され、それぞれにLCID(Windows Language Code Identifier)という識別IDが付いているみたいです。

昨今ニュースでよく見聞きする国/地域のロケールは以下の通りです。

[言語コード]-[国/地域コード] [言語コード] [国/地域コード] [LCID(10進数)] [LCID(16進数)]
ja-JP 日本語 日本 1041 0x0411
en-US 英語 アメリ 1039 0x0409
ru-RU ロシア語 ロシア 1049 0x0419
uk-UA ウクライナ ウクライナ 1058 0x0422
be-BY ベラルーシ ベラルーシ 1059 0x0423
zh-CN 中国語(繁体字 中国 2052 0x0804
zh-TW 中国語(簡体字 台湾 1028 0x0404
ko-KR ハングル 韓国 1042 0x0412
ko-KP ハングル 北朝鮮 未定義 未定義

MSが公開しているLCIDのリファレンスです。
learn.microsoft.com

システムロケールの確認方法

幾つかの方法で、Windowsのシステムロケールを確認してみます。

GUIで確認

コントロールパネルから確認可能です。
※時計と地域 > 地域 > Unicode対応でないプログラムの言語 > システムロケールの変更


PowerShellで確認

Get-WinSystemLocale」で確認可能です。

> Get-WinSystemLocale

LCID             Name             DisplayName
----             ----             -----------
1041             ja-JP            日本語 (日本)

WinAPIで確認

WinAPIだと「GetSystemDefaultLocaleName」と「GetSystemDefaultLCID」で確認可能です。
Vista以降だと、「GetSystemDefaultLocaleName」の使用が推奨されています。

Pythonのctypesで該当APIを呼び出す例です。

from ctypes import *
info = create_string_buffer(100)
WinDLL('kernel32').GetSystemDefaultLocaleName(byref(info), len(info))
print(info.raw.decode("s-jis"))

> ja-JP
from ctypes import *
print(WinDLL('kernel32').GetSystemDefaultLCID())

> 1041