C# 获取OEM和Ansi中每个语言环境的代码页

C# 获取OEM和Ansi中每个语言环境的代码页,c#,python,windows,locale,ansi,C#,Python,Windows,Locale,Ansi,如何获取每个语言环境的代码页(不仅仅是我的语言环境) 我正在寻找python/c#/c(首选python或c#)中的一个简单函数,以便为我想要的每个语言环境找到Ansi和OEM中的代码页。在c中,从Windows Vista开始,您可以查询有关via的信息。查询ANSI和OEM代码页的方法分别是LOCALE\u IDEFAULTANSICODEPAGE(0x1004)和LOCALE\u IDEFAULTCODEPAGE(0x000B)。您可以通过枚举所有系统语言环境名称,并查询回调中每个语言环境

如何获取每个语言环境的代码页(不仅仅是我的语言环境)


我正在寻找python/c#/c(首选python或c#)中的一个简单函数,以便为我想要的每个语言环境找到Ansi和OEM中的代码页。

在c中,从Windows Vista开始,您可以查询有关via的信息。查询ANSI和OEM代码页的方法分别是
LOCALE\u IDEFAULTANSICODEPAGE
(0x1004)和
LOCALE\u IDEFAULTCODEPAGE
(0x000B)。您可以通过枚举所有系统语言环境名称,并查询回调中每个语言环境的ANSI和OEM代码页

在Python脚本中,可以通过调用这些函数。例如:

导入ctypes
从ctypes导入c_int
从ctypes.wintypes导入BOOL、DWORD、LPVOID、LPWSTR、lpram、WCHAR
kernel32=ctypes.windell('kernel32',use\u last\u error=True)
CP_ACP=0
CP_OEMCP=1
区域设置\u名称\u用户\u默认值=无
LOCALE\u NAME\u SYSTEM\u DEFAULT=“!x-sys-DEFAULT-LOCALE”
区域设置\返回\编号=0x20000000
区域设置\u IDEFAULTCODEPAGE=0x0000000B
LOCALE_IDEFAULTANSICODEPAGE=0x00001004
语言环境\u SENGLISHLANGUAGENAME=0x00001001
语言环境\u SENGLISHCOUNTRYNAME=0x00001002
LOCALE_ENUMPROCEX=ctypes.WINFUNCTYPE(BOOL,
LPWSTR,#lpLocaleString
德沃德,#德沃兹
LPARAM)#LPARAM
定义检查零(结果、函数、参数):
如果没有结果:
引发ctypes.WinError(ctypes.get\u last\u error())
返回参数
kernel32.EnumSystemLocalesEx.errcheck=\u check\u zero
kernel32.EnumSystemLocalesEx.argtypes=(
LOCALE_ENUMPROCEX,#lpLocaleEnumProcEx
德沃德,#德沃兹
LPARAM,#LPARAM
LPVOID)#LPVOID保留
LCTYPE=DWORD
kernel32.getLocaleInfo.errcheck=\u check\u zero
kernel32.getLocaleInfo.argtypes=(
LPWSTR,#lpLocaleName,
LCTYPE,#LCTYPE,
LPVOID,#lpLCData,
c#u int#cchData
def get_语言(语言环境=语言环境名称系统默认值):
length=kernel32.getLocaleInfo(locale,locale\u SENGLISHLANGUAGENAME,
无,0)
语言=(WCHAR*长度)()
kernel32.getLocaleInfo(locale,locale\u SENGLISHLANGUAGENAME,
语言(长度)
返回语言.value
def get_国家(语言环境=语言环境名称系统默认值):
length=kernel32.getLocaleInfo(locale,locale\u SENGLISHCOUNTRYNAME,
无,0)
国家=(WCHAR*长度)()
kernel32.getLocaleInfo(locale,locale\u SENGLISHCOUNTRYNAME,
国家、长度)
返回国家/地区值
def get_acp(语言环境=语言环境\u名称\u系统\u默认值):
cp_ansi=DWORD()
kernel32.getLocaleInfo(locale,locale_IDEFAULTANSICODEPAGE)
区域设置\返回\编号,ctypes.byref(cp\ U ansi),
ctypes.sizeof(cp_ansi)//ctypes.sizeof(WCHAR))
返回cp_ansi.value
def get_oemcp(语言环境=语言环境名称系统默认值):
cp_oem=DWORD()
kernel32.getLocaleInfo(locale,locale_IDEFAULTCODEPAGE)
地区\返回\编号,ctypes.byref(cp\ U oem),
ctypes.sizeof(cp_oem)//ctypes.sizeof(WCHAR))
返回cp_.oem.value
def list_system_locales():
系统语言环境=[]
@语言环境
def enum_cb(区域设置、标志、参数):
system_locales.append((locale,
获取语言(地区),获取国家(地区),
获取\u acp(区域设置),获取\u oemcp(区域设置)))
返回真值
内核32.EnumSystemLocalesEx(enum_cb,0,0,无)
返回排序(系统\区域设置)
请注意,仅限Unicode的区域设置没有ANSI或OEM代码页。在这种情况下,返回的值用于当前系统ANSI和OEM代码页,即
CP\U ACP
(0)和
CP\U OEMCP
(1)。例如,印度的印地语(hi)是一种仅限Unicode的语言环境:

>>> (get_acp('hi-IN'), get_oemcp('hi-IN')) == (CP_ACP, CP_OEMCP)
True

非常感谢你!有没有办法进入列表,让
list\u system\u locales
像我在windows locale Window上看到的那样返回完整的国家/地区(lang),而不是像
ff NG
en MG
,该列表是否适用于所有windows版本,还是取决于某些内容?
EnumSystemLocalesEx
枚举当前系统上可用的区域设置;它不会在所有系统上都是相同的。此外,还可以缩小枚举范围。我让它枚举所有区域设置,包括具有备用排序的变体。当我有时间时,我会添加一个函数来获取完整的语言和国家名称。我会感谢您查看完整的语言和国家名称。我的意思是,如果我在
ff NG
中看到它在ansi代码页X和wity oem代码页Y中使用,那么在所有windows版本中都是这样吗?或者在另一个版本中使用另一个代码页我不知道代码页分配的历史可以追溯到1993年的WindowsNT3.1。代码页是遗留的语言环境数据,所以我认为它们至少从WindowsVista开始就稳定了。我的更新答案需要Windows 7+。语言环境名称是在Vista中引入的,代替了本地ID(LCID),但我用于语言和国家的英文名称的信息常量是在Windows 7.1中引入的)当我在win 7中运行此代码时,我得到一个包含360个项目的列表,当我在win 10中运行它时,我得到一个包含850个项目的列表,那么win 10中有一个区域设置,但win 7中没有?2) 我在ansi代码第0页看到的“Embu”、“肯尼亚”是错误的吗?我在这里看到了en.wikipedia.org/wiki/Code_页面所有windows的代码页,而没有看到代码页0非常感谢!