web-dev-qa-db-ja.com

IOSで国名から国コードを取得します

サーバーから国名を英語で取得しています。例:「スペイン」

私がしたいのは、国名が英語で書かれると仮定して、国コードを取得することです。

私は何をすべきか?国コードから国名を取得するのは非常に簡単ですが、反対の操作を行う方法がわかりません。

どうもありがとう。

24
pdrcabrod

Jefの answer がここで役立ちましたが、少し追加されました。

NSArray *countryCodes = [NSLocale ISOCountryCodes];
NSMutableArray *countries = [NSMutableArray arrayWithCapacity:[countryCodes count]];

for (NSString *countryCode in countryCodes)
{
    NSString *identifier = [NSLocale localeIdentifierFromComponents: [NSDictionary dictionaryWithObject: countryCode forKey: NSLocaleCountryCode]];
    NSString *country = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_UK"] displayNameForKey: NSLocaleIdentifier value: identifier];
    [countries addObject: country];
}

NSDictionary *codeForCountryDictionary = [[NSDictionary alloc] initWithObjects:countryCodes forKeys:countries];

次に、コードが必要な国の名前を使用して「codeForCountryDictionary」を実行します。たとえば、

NSLog(@"%@",[codeForCountryDictionary objectForKey:@"Spain"]);

結果は、スペインの2文字の国コードである「ES」として得られます。

30
Breakpoint

A Swift 4@ Daxesh Nagarソリューションの更新バージョン:

private func locale(for fullCountryName : String) -> String {
    var locales : String = ""
    for localeCode in NSLocale.isoCountryCodes {
        let identifier = NSLocale(localeIdentifier: localeCode)
        let countryName = identifier.displayName(forKey: NSLocale.Key.countryCode, value: localeCode)
        if fullCountryName.lowercased() == countryName?.lowercased() {
            return localeCode as! String
        }
    }
    return locales
}

この入力の場合fullCountryName

"イギリス"

次のように国コードを返します

「GB」

皆さんのお役に立てば幸いです。

9
GuilhermeM

Swiftでは、このコードを使用します

extension NSLocale {
    class func locales1(countryName1 : String) -> String {
        var locales : String = ""
        for localeCode in NSLocale.ISOCountryCodes() {
            let countryName = NSLocale.systemLocale().displayNameForKey(NSLocaleCountryCode, value: localeCode)!
            if countryName1.lowercaseString == countryName.lowercaseString {
                return localeCode as! String
            }
        }
        return locales
    }


}

データを取得します。

strP2countrycode = NSLocale.locales1("PASS_COUNTRYNAME")
4
Daxesh Nagar

英語の国名バージョンのみと照合するための修正を含む私のコンパクトバージョン。

extension NSLocale
{
    class func localeForCountry(countryName : String) -> String?
    {
        return NSLocale.ISOCountryCodes().first{self.countryNameFromLocaleCode($0 as! String) == countryName} as? String
    }

    private class func countryNameFromLocaleCode(localeCode : String) -> String
    {
        return NSLocale(localeIdentifier: "en_UK").displayNameForKey(NSLocaleCountryCode, value: localeCode) ?? ""
    }
}
2
Fawkes

Swift 3では、使用できるのは

let currentLocale = NSLocale.current
var countries = NSLocale.isoCountryCodes
currentLocale.localizedString(forRegionCode: countries.first!)
2
Piotr Badura

Swift 3を使用します(上記の回答の一部には欠けています)

extension NSLocale {
class func locales1(countryName1 : String) -> String {
    let locales : String = ""
    for localeCode in NSLocale.isoCountryCodes {
        let countryName = (Locale.current as NSLocale).displayName(forKey: .countryCode, value: localeCode)
        if countryName1.lowercased() == countryName?.lowercased() {
            return localeCode
        }
    }
    return locales
}
}
1
Robert Varga

Swift 3以降で機能する簡単なソリューションを次に示します。OSのバージョンに応じて、これは約256の国名とコードをサポートします。

extension Locale {
    func isoCode(for countryName: String) -> String? {
        return Locale.isoRegionCodes.first(where: { (code) -> Bool in
            localizedString(forRegionCode: code)?.compare(countryName, options: [.caseInsensitive, .diacriticInsensitive]) == .orderedSame
        })
    }
}

これを正しく使用する秘訣は、標準の2文字のISO国コードに変換する国名の言語を知ることです。

国名が英語であることがわかっている場合は、これを英語に設定されたロケールで使用する必要があります。そのような場合は、en_US_POSIXの特別なロケールを使用するのが最善です。

let locale = Locale(identifier: "en_US_POSIX") 
print(locale.isoCode(for: "Spain")) // result is `ES`

スペイン語で国名がある場合は、必ずスペイン語のロケールを使用してください。

let locale = Locale(identifier: "es") 
print(locale.isoCode(for: "España")) // result is `ES`
1
rmaddy

Swift 3.0:

国コードと国名をNS Dictionary-として取得します

let countryCodes: [AnyObject] = NSLocale.isoCountryCodes as [AnyObject]

        let countries: NSMutableArray = NSMutableArray(capacity: countryCodes.count)

        for countryCode in countryCodes {
            let identifier: String = NSLocale.localeIdentifier(fromComponents: NSDictionary(object: countryCode, forKey: NSLocale.Key.countryCode as NSCopying) as! [String : String])
            let country: String = NSLocale(localeIdentifier: "en_US").displayName(forKey: NSLocale.Key.identifier, value: identifier)!
            countries.add(country)
        }
        let codeForCountryDictionary: [NSObject : AnyObject] = NSDictionary(objects: countryCodes, forKeys: countries as! [NSCopying]) as [NSObject : AnyObject]

        print(codeForCountryDictionary)
1
A.G

これは、Swift 4.0(Swift 3.2)でも機能する)でこれを行う方法です。

NSLocale.isoCountryCodes.forEach { (code) in
    print(code)
    let name = NSLocale(localeIdentifier: "zh_CN").displayName(forKey: NSLocale.Key.countryCode, value: code)
    print(name)
}
0
Lumialxk

ここにSwift 3のDaxesh Negarコードがあります

    extension NSLocale {
    class func locales1(countryName1 : String) -> String {
        let locales : String = ""
        for localeCode in NSLocale.isoCountryCodes {
            let countryName = Locale.current.regionCode
            if countryName1.lowercased() == countryName?.lowercased() {
                return localeCode
            }
        }
        return locales
    }
}
0

したがって、このソリューションはSwift 4上記のコメントから取得...

extension NSLocale {
   struct Locale {
    let countryCode: String
    let countryName: String
   }

  class func locales() -> [Locale] {

    var locales = [Locale]()

    for localeCode in NSLocale.isoCountryCodes {
        let identifier = NSLocale(localeIdentifier: localeCode)
        let countryName = identifier.displayName(forKey: NSLocale.Key.countryCode, value: localeCode)!
        let countryCode = localeCode
        let locale = Locale(countryCode: countryCode, countryName: countryName)
        locales.append(locale)
    }

    return locales.sorted{$0.countryName.localizedCaseInsensitiveCompare($1.countryName) == ComparisonResult.orderedAscending}
 }
}

楽しい!

0
Pablo Segura