【问题标题】:在Objective-C中将国家代码2个字母转换为3个字母
【发布时间】:2022-01-23 16:16:33
【问题描述】:

我正在开发一个从手机获取国家代码的函数,但是当我得到国家代码时,它由 2 个字母组成,但我希望它返回三个字母。

例如US -> USA

在Android中,java支持将2个字符转换为3个字符,代码如下:

Locale locale = new Locale("en", countryCode);
return locale.getISO3Country();

但是在带有 Objective-C 的 iOS 中我不知道如何转换它,所以任何人都可以帮我解决这个问题吗?

【问题讨论】:

标签: android ios objective-c


【解决方案1】:

为了标准化,Apple 平台上没有可转换的 ISO 3166-1 alpha-3 代码。反之亦然,您可以使用 3 个字母的代码,但仍然可以找到 2 个字母的代码。

如果您希望至少与您的 android 代码保持一些一致性,那么您需要自己实现一些支持这种非标准功能的 LUT 表。无论如何,可用列表不是很长(256 个代码)。

NSArray *isoCountrys = [NSLocale ISOCountryCodes];
for (NSString *code in isoCountrys) {
    NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:code];
     // country name in native language
    NSString *country = [locale localizedStringForCountryCode:code];
    NSString *iso3 = LUTisoA3counterpartCodes[code];
    NSLog(@"%@ %@ %@ %@",code, iso3, country, locale.localeIdentifier);
}

文档NSLocale-localizedStringForCountryCode:
文档NSLocale-countryCode

LUT 可能看起来像.. 并且存储在 plist 中比以下运行时分配的字典要好得多。

NSDictionary *LUTisoA3counterpartCodes = @{
    @"AC":@"SHN",@"AW":@"ABW",@"AF":@"AFG",@"AO":@"AGO",@"AI":@"AIA",@"AX":@"ALA",
    @"AL":@"ALB",@"AD":@"AND",@"AE":@"ARE",@"AR":@"ARG",@"AM":@"ARM",@"AS":@"ASM",
    @"AQ":@"ATA",@"TF":@"ATF",@"AG":@"ATG",@"AU":@"AUS",@"AT":@"AUT",@"AZ":@"AZE",
    @"BI":@"BDI",@"BE":@"BEL",@"BJ":@"BEN",@"BQ":@"BES",@"BF":@"BFA",@"BD":@"BGD",
    @"BG":@"BGR",@"BH":@"BHR",@"BS":@"BHS",@"BA":@"BIH",@"BL":@"BLM",@"BG":@"BLR",
    @"BZ":@"BLZ",@"BM":@"BMU",@"BO":@"BOL",@"BR":@"BRA",@"BB":@"BRB",@"BN":@"BRN",
    @"BT":@"BTN",@"BV":@"BVT",@"BW":@"BWA",@"CF":@"CAF",@"CA":@"CAN",@"CC":@"CCK",
    @"CH":@"CHE",@"CL":@"CHL",@"CN":@"CHN",@"CI":@"CIV",@"CM":@"CMR",@"CD":@"COD",
    @"CG":@"COG",@"CK":@"COK",@"CO":@"COL",@"KM":@"COM",@"CV":@"CPV",@"CR":@"CRI",
    @"CU":@"CUB",@"CW":@"CUW",@"CX":@"CXR",@"KY":@"CYM",@"CY":@"CYP",@"CZ":@"CZE",
    @"DE":@"DEU",@"DJ":@"DJI",@"DM":@"DMA",@"DK":@"DNK",@"DO":@"DOM",@"DZ":@"DZA",
    @"EC":@"ECU",@"EG":@"EGY",@"ER":@"ERI",@"EH":@"ESH",@"ES":@"ESP",@"EE":@"EST",
    @"ET":@"ETH",@"FI":@"FIN",@"FJ":@"FJI",@"FK":@"FLK",@"FR":@"FRA",@"FO":@"FRO",
    @"FM":@"FSM",@"GA":@"GAB",@"GB":@"GBR",@"GE":@"GEO",@"GG":@"GGY",@"GH":@"GHA",
    @"GI":@"GIB",@"GN":@"GIN",@"GP":@"GLP",@"GM":@"GMB",@"GW":@"GNB",@"GQ":@"GNQ",
    @"GR":@"GRC",@"GD":@"GRD",@"GL":@"GRL",@"GT":@"GTM",@"GF":@"GUF",@"GU":@"GUM",
    @"GY":@"GUY",@"HK":@"HKG",@"HM":@"HMD",@"HN":@"HND",@"HR":@"HRV",@"HT":@"HTI",
    @"HU":@"HUN",@"ID":@"IDN",@"IM":@"IMN",@"IN":@"IND",@"IO":@"IOT",@"IE":@"IRL",
    @"IR":@"IRN",@"IQ":@"IRQ",@"IS":@"ISL",@"IL":@"ISR",@"IT":@"ITA",@"JM":@"JAM",
    @"JE":@"JEY",@"JO":@"JOR",@"JP":@"JPN",@"KZ":@"KAZ",@"KE":@"KEN",@"KG":@"KGZ",
    @"KH":@"KHM",@"KI":@"KIR",@"KN":@"KNA",@"KR":@"KOR",@"KW":@"KWT",@"LA":@"LAO",
    @"LB":@"LBN",@"LR":@"LBR",@"LY":@"LBY",@"LC":@"LCA",@"LI":@"LIE",@"LK":@"LKA",
    @"LS":@"LSO",@"LT":@"LTU",@"LU":@"LUX",@"LV":@"LVA",@"MO":@"MAC",@"MF":@"MAF",
    @"MA":@"MAR",@"MC":@"MCO",@"MD":@"MDA",@"MG":@"MDG",@"MV":@"MDV",@"MX":@"MEX",
    @"MH":@"MHL",@"MK":@"MKD",@"ML":@"MLI",@"MT":@"MLT",@"MM":@"MMR",@"ME":@"MNE",
    @"MN":@"MNG",@"MP":@"MNP",@"MZ":@"MOZ",@"MR":@"MRT",@"MS":@"MSR",@"MQ":@"MTQ",
    @"MU":@"MUS",@"MW":@"MWI",@"MY":@"MYS",@"YT":@"MYT",@"NA":@"NAM",@"NC":@"NCL",
    @"NE":@"NER",@"NF":@"NFK",@"NG":@"NGA",@"NI":@"NIC",@"NU":@"NIU",@"NL":@"NLD",
    @"NO":@"NOR",@"NP":@"NPL",@"NR":@"NRU",@"NZ":@"NZL",@"OM":@"OMN",@"PK":@"PAK",
    @"PA":@"PAN",@"PN":@"PCN",@"PE":@"PER",@"PH":@"PHL",@"PW":@"PLW",@"PG":@"PNG",
    @"PL":@"POL",@"PR":@"PRI",@"KP":@"PRK",@"PT":@"PRT",@"PY":@"PRY",@"PS":@"PSE",
    @"PF":@"PYF",@"QA":@"QAT",@"RE":@"REU",@"RO":@"ROU",@"RU":@"RUS",@"RW":@"RWA",
    @"SA":@"SAU",@"SD":@"SDN",@"SN":@"SEN",@"SG":@"SGP",@"GS":@"SGS",@"SH":@"SHN",
    @"SJ":@"SJM",@"SB":@"SLB",@"SL":@"SLE",@"SV":@"SLV",@"SM":@"SMR",@"SO":@"SOM",
    @"PM":@"SPM",@"RS":@"SRB",@"SS":@"SSD",@"ST":@"STP",@"SR":@"SUR",@"SK":@"SVK",
    @"SI":@"SVN",@"SE":@"SWE",@"SZ":@"SWZ",@"SX":@"SXM",@"SC":@"SYC",@"SY":@"SYR",
    @"TC":@"TCA",@"TD":@"TCD",@"TG":@"TGO",@"TH":@"THA",@"TJ":@"TJK",@"TK":@"TKL",
    @"TM":@"TKM",@"TL":@"TLS",@"TO":@"TON",@"TT":@"TTO",@"TN":@"TUN",@"TR":@"TUR",
    @"TV":@"TUV",@"TW":@"TWN",@"TZ":@"TZA",@"UG":@"UGA",@"UA":@"UKR",@"UM":@"UMI",
    @"UY":@"URY",@"US":@"USA",@"UZ":@"UZB",@"VA":@"VAT",@"VC":@"VCT",@"VE":@"VEN",
    @"VG":@"VGB",@"VI":@"VIR",@"VN":@"VNM",@"VU":@"VUT",@"WF":@"WLF",@"WS":@"WSM",
    @"XK":@"XKV",@"YE":@"YEM",@"ZA":@"ZAF",@"ZM":@"ZMB",@"ZW":@"ZWE",
    //unknown status or codes, to be changed soon
    @"DG":@"DGA" , //Diego Garcia
    @"EA":@"EA_" , //Ceuta and Melilla
    @"CP":@"CPT" , //Clipperton Island -> French Polynesia
    @"IC":@"IC_" , //Kanarian Island
    @"TA":@"TAA" , //டிரிஸ்டன் டா குன்ஹா , Tristan da Cunha -> St.Helena
};

此 LUT 可轻松通过 2 个字母代码查找并获取 3 个字母代码。实际上,这个列表要长得多,而且会发生永久性的变化。

如果您信任 Apples API 的排序,您可以只使用静态 NSArray 而不是 plist 或 NSDictionary。下面打印出来使用..

int i=1;
fprintf(stderr,"\nstatic NSString *isoA3accordingToAppleSorting[256] = {\n");
for (NSString *code in isoCountrys) {
    if (i%20 == 19) fprintf(stderr,"\n");
    NSString *iso3 = LUTisoA3counterpartCodes[code];
    fprintf(stderr,"@\"%s\",",iso3.UTF8String);
    i++;
}
fprintf(stderr,"};\n");

看起来像..

static NSString *countryCodeAsA3accordingToAppleSorting[256] = {
@"SHN",@"AND",@"ARE",@"AFG",@"ATG",@"AIA",@"ALB",@"ARM",@"AGO",@"ATA",@"ARG",@"ASM",@"AUT",@"AUS",@"ABW",@"ALA",@"AZE",@"BIH",
@"BRB",@"BGD",@"BEL",@"BFA",@"BGR",@"BHR",@"BDI",@"BEN",@"BLM",@"BMU",@"BRN",@"BOL",@"BES",@"BRA",@"BHS",@"BTN",@"BVT",@"BWA",@"BLR",@"BLZ",
@"CAN",@"CCK",@"COD",@"CAF",@"COG",@"CHE",@"CIV",@"COK",@"CHL",@"CMR",@"CHN",@"COL",@"CPT",@"CRI",@"CUB",@"CPV",@"CUW",@"CXR",@"CYP",@"CZE",
@"DEU",@"DGA",@"DJI",@"DNK",@"DMA",@"DOM",@"DZA",@"EA_",@"ECU",@"EST",@"EGY",@"ESH",@"ERI",@"ESP",@"ETH",@"FIN",@"FJI",@"FLK",@"FSM",@"FRO",
@"FRA",@"GAB",@"GBR",@"GRD",@"GEO",@"GUF",@"GGY",@"GHA",@"GIB",@"GRL",@"GMB",@"GIN",@"GLP",@"GNQ",@"GRC",@"SGS",@"GTM",@"GUM",@"GNB",@"GUY",
@"HKG",@"HMD",@"HND",@"HRV",@"HTI",@"HUN",@"IC_",@"IDN",@"IRL",@"ISR",@"IMN",@"IND",@"IOT",@"IRQ",@"IRN",@"ISL",@"ITA",@"JEY",@"JAM",@"JOR",
@"JPN",@"KEN",@"KGZ",@"KHM",@"KIR",@"COM",@"KNA",@"PRK",@"KOR",@"KWT",@"CYM",@"KAZ",@"LAO",@"LBN",@"LCA",@"LIE",@"LKA",@"LBR",@"LSO",@"LTU",
@"LUX",@"LVA",@"LBY",@"MAR",@"MCO",@"MDA",@"MNE",@"MAF",@"MDG",@"MHL",@"MKD",@"MLI",@"MMR",@"MNG",@"MAC",@"MNP",@"MTQ",@"MRT",@"MSR",@"MLT",
@"MUS",@"MDV",@"MWI",@"MEX",@"MYS",@"MOZ",@"NAM",@"NCL",@"NER",@"NFK",@"NGA",@"NIC",@"NLD",@"NOR",@"NPL",@"NRU",@"NIU",@"NZL",@"OMN",@"PAN",
@"PER",@"PYF",@"PNG",@"PHL",@"PAK",@"POL",@"SPM",@"PCN",@"PRI",@"PSE",@"PRT",@"PLW",@"PRY",@"QAT",@"REU",@"ROU",@"SRB",@"RUS",@"RWA",@"SAU",
@"SLB",@"SYC",@"SDN",@"SWE",@"SGP",@"SHN",@"SVN",@"SJM",@"SVK",@"SLE",@"SMR",@"SEN",@"SOM",@"SUR",@"SSD",@"STP",@"SLV",@"SXM",@"SYR",@"SWZ",
@"TAA",@"TCA",@"TCD",@"ATF",@"TGO",@"THA",@"TJK",@"TKL",@"TLS",@"TKM",@"TUN",@"TON",@"TUR",@"TTO",@"TUV",@"TWN",@"TZA",@"UKR",@"UGA",@"UMI",
@"USA",@"URY",@"UZB",@"VAT",@"VCT",@"VEN",@"VGB",@"VIR",@"VNM",@"VUT",@"WLF",@"WSM",@"XKV",@"YEM",@"MYT",@"ZAF",@"ZMB",@"ZWE",};

但是你必须在苹果 ISOCountryCodes 中找到你的 2 字母代码的索引才能相应地查找它们。

提醒。 ISO 3166-1 alpha-3 只解释它应该有 3 个字母,而不是确切的哪个字母

【讨论】:

    猜你喜欢
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-18
    • 2021-03-17
    • 1970-01-01
    相关资源
    最近更新 更多