Swift通过unicode将国家代码转换为表情符号标志

Edg*_*ian 44 unicode swift

我正在寻找一种快速的方式来转变:

let germany = "DE" 
Run Code Online (Sandbox Code Playgroud)

let flag = "\u{1f1e9}\u{1f1ea}"
Run Code Online (Sandbox Code Playgroud)

也就是说,什么是映射D1f1e9,并E1f1ea 我一直在寻找.utf8的字符串,但这返回一个整数.

FWIW我的总体目标是能够获取任意国家代码并获得相应的表情符号标志.

编辑:我也很好,只是拿着一个表,如果它可以在某处使用这个映射.我用Google搜索但没找到它.

mat*_*att 74

这是将两个字母的国家/地区代码转换为表情符号标志的通用公式:

func flag(country:String) -> String {
    let base = 127397
    var usv = String.UnicodeScalarView()
    for i in country.utf16 {
        usv.append(UnicodeScalar(base + Int(i)))
    }
    return String(usv)
}

let s = flag("DE")
Run Code Online (Sandbox Code Playgroud)

编辑 Ooops,无需通过嵌套的String.UnicodeScalarView结构.事实证明,String有一种append方法可以用于此目的.所以:

func flag(country:String) -> String { 
    let base : UInt32 = 127397
    var s = ""
    for v in country.unicodeScalars {
        s.append(UnicodeScalar(base + v.value))
    }
    return s
}
Run Code Online (Sandbox Code Playgroud)

再次编辑 Oooops,在Swift 3中他们取消了将UnicodeScalar附加到String的能力,并且他们使UnicodeScalar初始化器可用(Xcode 8种子6),所以现在它看起来像这样:

func flag(country:String) -> String {
    let base : UInt32 = 127397
    var s = ""
    for v in country.unicodeScalars {
        s.unicodeScalars.append(UnicodeScalar(base + v.value)!)
    }
    return String(s)
}
Run Code Online (Sandbox Code Playgroud)

  • 模糊的魔法常数?:) - 比如`let regionalA ="".unicodeScalars; 让letterA ="A".unicodeScalars; let base = regionalA [regionalA.startIndex] .value - letterA [letterA.startIndex] .value`?(可以简化.) (2认同)
  • 我绝对喜欢表情符号家伙实际上考虑根据实际ISO国家代码的索引/排序将字符添加到字符集中! (2认同)
  • 请参阅https://en.wikipedia.org/wiki/Regional_Indicator_Symbol标志从代码点0x1F1E6开始。“ A”的偏移量为65。0x1F1E6-65 = 127397 (2认同)
  • @LudovicLandry 为什么要改变历史?多年来,这个答案与 Swift 一起发展起来。不要把它变成关于过去的谎言。如果你不喜欢它,请投反对票,或者给出你自己更好的答案,但不要把话放在我嘴里。 (2认同)

Rol*_*asR 17

如果在ObjectiveC中寻找解决方案的人在这里是方便的类别:

@interface NSLocale (RREmoji)

+ (NSString *)emojiFlagForISOCountryCode:(NSString *)countryCode;

@end


@implementation NSLocale (RREmoji)


+ (NSString *)emojiFlagForISOCountryCode:(NSString *)countryCode {
    NSAssert(countryCode.length == 2, @"Expecting ISO country code");

    int base = 127462 -65;

    wchar_t bytes[2] = {
        base +[countryCode characterAtIndex:0],
        base +[countryCode characterAtIndex:1]
    };

    return [[NSString alloc] initWithBytes:bytes
                                    length:countryCode.length *sizeof(wchar_t)
                                  encoding:NSUTF32LittleEndianStringEncoding];
}


@end
Run Code Online (Sandbox Code Playgroud)

测试:

for ( NSString *countryCode in [NSLocale ISOCountryCodes] ) {
    NSLog(@"%@ - %@", [NSLocale emojiFlagForISOCountryCode:countryCode], countryCode);
}
Run Code Online (Sandbox Code Playgroud)

输出: - AD - AE - AF - AG - AI ......

  • 请注意,如果您的地区设置为中国(中国),则(Taïwan)会丢失. (5认同)

bud*_*ino 10

我知道这不完全是被问到的,但也许它会帮助某人:

let flags: [String: String] = [
  "AD": "", "AE": "", "AF": "", "AG": "", "AI": "", "AL": "", "AM": "", "AO": "", "AQ": "", "AR": "", "AS": "", "AT": "", "AU": "", "AW": "", "AX": "", "AZ": "", "BA": "", "BB": "", "BD": "", "BE": "", "BF": "", "BG": "", "BH": "", "BI": "", "BJ": "", "BL": "", "BM": "", "BN": "", "BO": "", "BQ": "", "BR": "", "BS": "", "BT": "", "BV": "", "BW": "", "BY": "", "BZ": "", "CA": "", "CC": "", "CD": "", "CF": "", "CG": "", "CH": "", "CI": "", "CK": "", "CL": "", "CM": "", "CN": "", "CO": "", "CR": "", "CU": "", "CV": "", "CW": "", "CX": "", "CY": "", "CZ": "", "DE": "", "DJ": "", "DK": "", "DM": "", "DO": "", "DZ": "", "EC": "", "EE": "", "EG": "", "EH": "", "ER": "", "ES": "", "ET": "", "FI": "", "FJ": "", "FK": "", "FM": "", "FO": "", "FR": "", "GA": "", "GB": "", "GD": "", "GE": "", "GF": "", "GG": "", "GH": "", "GI": "", "GL": "", "GM": "", "GN": "", "GP": "", "GQ": "", "GR": "", "GS": "", "GT": "", "GU": "", "GW": "", "GY": "", "HK": "", "HM": "", "HN": "", "HR": "", "HT": "", "HU": "", "ID": "", "IE": "", "IL": "", "IM": "", "IN": "", "IO": "", "IQ": "", "IR": "", "IS": "", "IT": "", "JE": "", "JM": "", "JO": "", "JP": "", "KE": "", "KG": "", "KH": "", "KI": "", "KM": "", "KN": "", "KP": "", "KR": "", "KW": "", "KY": "", "KZ": "", "LA": "", "LB": "", "LC": "", "LI": "", "LK": "", "LR": "", "LS": "", "LT": "", "LU": "", "LV": "", "LY": "", "MA": "", "MC": "", "MD": "", "ME": "", "MF": "", "MG": "", "MH": "", "MK": "", "ML": "", "MM": "", "MN": "", "MO": "", "MP": "", "MQ": "", "MR": "", "MS": "", "MT": "", "MU": "", "MV": "", "MW": "", "MX": "", "MY": "", "MZ": "", "NA": "", "NC": "", "NE": "", "NF": "", "NG": "", "NI": "", "NL": "", "NO": "", "NP": "", "NR": "", "NU": "", "NZ": "", "OM": "", "PA": "", "PE": "", "PF": "", "PG": "", "PH": "", "PK": "", "PL": "", "PM": "", "PN": "", "PR": "", "PS": "", "PT": "", "PW": "", "PY": "", "QA": "", "RE": "", "RO": "", "RS": "", "RU": "", "RW": "", "SA": "", "SB": "", "SC": "", "SD": "", "SE": "", "SG": "", "SH": "", "SI": "", "SJ": "", "SK": "", "SL": "", "SM": "", "SN": "", "SO": "", "SR": "", "SS": "", "ST": "", "SV": "", "SX": "", "SY": "", "SZ": "", "TC": "", "TD": "", "TF": "", "TG": "", "TH": "", "TJ": "", "TK": "", "TL": "", "TM": "", "TN": "", "TO": "", "TR": "", "TT": "", "TV": "", "TW": "", "TZ": "", "UA": "", "UG": "", "UM": "", "US": "", "UY": "", "UZ": "", "VA": "", "VC": "", "VE": "", "VG": "", "VI": "", "VN": "", "VU": "", "WF": "", "WS": "", "YE": "", "YT": "", "ZA": "", "ZM": "", "ZW": ""
]
Run Code Online (Sandbox Code Playgroud)


小智 9

使用 Swift 5 将两个字母的国家/地区代码转换为其表情符号标志的另一个功能。

internal func getFlag(from countryCode: String) -> String {
    countryCode
        .unicodeScalars
        .map({ 127397 + $0.value })
        .compactMap(UnicodeScalar.init)
        .map(String.init)
        .joined()
}
Run Code Online (Sandbox Code Playgroud)


Ale*_*tev 9

我使用这个实现

func countryFlag(_ countryCode: String) -> String {
    let flagBase = UnicodeScalar("").value - UnicodeScalar("A").value

    let flag = countryCode
        .uppercased()
        .unicodeScalars
        .compactMap({ UnicodeScalar(flagBase + $0.value)?.description })
        .joined()
    return flag
}
Run Code Online (Sandbox Code Playgroud)

现在我们可以在 Playground 中用这种方法测试这个函数

let isoCodes = Locale.isoRegionCodes
for isoCode in isoCodes {
    print(countryFlag(isoCode))
}
Run Code Online (Sandbox Code Playgroud)

我们得到


Lum*_*lxk 7

马特答案的两种优化。

  • 无需在Swift 4中传递嵌套的String
  • 为了避免传递小写字符串,我添加了uppercased()

这是代码。

func flag(from country:String) -> String {
    let base : UInt32 = 127397
    var s = ""
    for v in country.uppercased().unicodeScalars {
        s.unicodeScalars.append(UnicodeScalar(base + v.value)!)
    }
    return s
}
Run Code Online (Sandbox Code Playgroud)