gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:32:15 26 4
gpt4 key购买 nike

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

我在 python/c#/c(更喜欢 python 或 c#)中寻找一个简单的函数来为我想要的每个语言环境找到什么是 Ansi 和 OEM 中的代码页。

最佳答案

在 C 中,从 Windows Vista 开始,您可以查询 locale name 的信息通过GetLocaleInfoEx . locale information constants查询 ANSI 和 OEM 代码页分别是 LOCALE_IDEFAULTANSICODEPAGE (0x1004) 和 LOCALE_IDEFAULTCODEPAGE (0x000B)。您可以通过 EnumSystemLocalesEx 枚举所有系统区域设置名称并查询回调中每个语言环境的 ANSI 和 OEM 代码页。

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

import ctypes
from ctypes import c_int
from ctypes.wintypes import BOOL, DWORD, LPVOID, LPWSTR, LPARAM, WCHAR

kernel32 = ctypes.WinDLL('kernel32', use_last_error=True)

CP_ACP = 0
CP_OEMCP = 1
LOCALE_NAME_USER_DEFAULT = None
LOCALE_NAME_SYSTEM_DEFAULT = "!x-sys-default-locale"
LOCALE_RETURN_NUMBER = 0x20000000
LOCALE_IDEFAULTCODEPAGE = 0x0000000B
LOCALE_IDEFAULTANSICODEPAGE = 0x00001004
LOCALE_SENGLISHLANGUAGENAME = 0x00001001
LOCALE_SENGLISHCOUNTRYNAME = 0x00001002

LOCALE_ENUMPROCEX = ctypes.WINFUNCTYPE(BOOL,
LPWSTR, # lpLocaleString
DWORD, # dwFlags
LPARAM) # lParam

def _check_zero(result, func, args):
if not result:
raise ctypes.WinError(ctypes.get_last_error())
return args

kernel32.EnumSystemLocalesEx.errcheck = _check_zero
kernel32.EnumSystemLocalesEx.argtypes = (
LOCALE_ENUMPROCEX, # lpLocaleEnumProcEx
DWORD, # dwFlags
LPARAM, # lParam
LPVOID) # lpReserved

LCTYPE = DWORD
kernel32.GetLocaleInfoEx.errcheck = _check_zero
kernel32.GetLocaleInfoEx.argtypes = (
LPWSTR, # lpLocaleName,
LCTYPE, # LCType,
LPVOID, # lpLCData,
c_int) # cchData

def get_language(locale=LOCALE_NAME_SYSTEM_DEFAULT):
length = kernel32.GetLocaleInfoEx(locale, LOCALE_SENGLISHLANGUAGENAME,
None, 0)
language = (WCHAR * length)()
kernel32.GetLocaleInfoEx(locale, LOCALE_SENGLISHLANGUAGENAME,
language, length)
return language.value

def get_country(locale=LOCALE_NAME_SYSTEM_DEFAULT):
length = kernel32.GetLocaleInfoEx(locale, LOCALE_SENGLISHCOUNTRYNAME,
None, 0)
country = (WCHAR * length)()
kernel32.GetLocaleInfoEx(locale, LOCALE_SENGLISHCOUNTRYNAME,
country, length)
return country.value

def get_acp(locale=LOCALE_NAME_SYSTEM_DEFAULT):
cp_ansi = DWORD()
kernel32.GetLocaleInfoEx(locale, LOCALE_IDEFAULTANSICODEPAGE |
LOCALE_RETURN_NUMBER, ctypes.byref(cp_ansi),
ctypes.sizeof(cp_ansi) // ctypes.sizeof(WCHAR))
return cp_ansi.value

def get_oemcp(locale=LOCALE_NAME_SYSTEM_DEFAULT):
cp_oem = DWORD()
kernel32.GetLocaleInfoEx(locale, LOCALE_IDEFAULTCODEPAGE |
LOCALE_RETURN_NUMBER, ctypes.byref(cp_oem),
ctypes.sizeof(cp_oem) // ctypes.sizeof(WCHAR))
return cp_oem.value

def list_system_locales():
system_locales = []
@LOCALE_ENUMPROCEX
def enum_cb(locale, flags, param):
system_locales.append((locale,
get_language(locale), get_country(locale),
get_acp(locale), get_oemcp(locale)))
return True
kernel32.EnumSystemLocalesEx(enum_cb, 0, 0, None)
return sorted(system_locales)

请注意,仅 Unicode 语言环境没有 ANSI 或 OEM 代码页。在这种情况下,返回的值针对当前系统 ANSI 和 OEM 代码页,即 CP_ACP (0) 和 CP_OEMCP (1)。例如,印度 (IN) 的印地语 (hi) 语言是一种仅限 Unicode 的语言环境:

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

关于c# - 获取 OEM 和 Ansi 中每个语言环境的代码页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52654470/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com