如何从RFC 5646格式区域设置字符串中解析国家代码?
从RFC5646格式区域名中提取国家代码
要从GetUserDefaultLocaleName返回的RFC5646格式字符串里提取国家代码,核心是掌握RFC5646语言标签的结构规则:
RFC5646的语言标签由多个连字符分隔的子标签组成,顺序为:语言代码(必填)→ 脚本代码(可选)→ 地区(国家/地区)代码(可选)→ 变体(可选)→ 扩展/私有部分(可选)。
国家代码的识别规则
国家代码属于「地区子标签」,具备以下特征:
- 格式为2个大写字母(符合ISO 3166-1 alpha-2标准,Win32返回的结果基本都是这种),或3个大写字母(ISO 3166-1 alpha-3);
- 位置上,它的前一个子标签要么是语言代码(2-3个小写字母,比如
uz、en),要么是脚本代码(4个字符,首字母大写其余小写,比如Latn、Hans); - 要排除变体、扩展、私有部分:变体通常是5个以上字母/数字组合,扩展以
-x-开头,私有部分格式无固定但不会符合国家代码的短大写字母特征。
实际案例解析
- 对于
uz-Latn-UZ:分割后得到["uz", "Latn", "UZ"],UZ是2位大写字母,前一个子标签是脚本代码Latn,符合国家代码特征,因此提取UZ; - 对于
en-US-x-custom:分割后得到["en", "US", "x", "custom"],US是2位大写字母,前一个是语言代码en,后续的x是扩展标记,因此US是国家代码; - 对于
zh-CN:分割后["zh", "CN"],CN直接对应国家代码。
更可靠的Win32原生方法
如果不想自己解析字符串,可以直接调用GetLocaleInfoEx函数,传入GetUserDefaultLocaleName获取的区域名,指定LOCALE_SISO3166CTRYNAME参数,就能直接拿到标准的2字母国家代码,避免手动解析可能出现的错误。
内容的提问来源于stack exchange,提问作者Myria
相关产品推荐
相关产品推荐

