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

时间:2015-05-22 17:16:31

标签: swift unicode

我正在寻找一种快速解决方法:

let germany = "DE" 

let flag = "\u{1f1e9}\u{1f1ea}"

即,D1f1e9E1f1ea的映射是什么 我在查看.utf8字符串,但这会返回一个整数。

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

编辑:如果它可以在某个地方使用,我也可以拿着一个执行此映射的表。我用Google搜索但没找到它。

7 个答案:

答案 0 :(得分:63)

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

BoardStart.format("MM-DD-YYYY");

编辑 Ooops,无需通过嵌套的String.UnicodeScalarView结构。事实证明,String恰好具有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") 方法。所以:

append

EDIT 再次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.append(UnicodeScalar(base + v.value))
    }
    return s
}

答案 1 :(得分: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

试验:

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

输出:  - 广告   - AE   - AF   - AG   - AI ...

答案 2 :(得分:7)

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

internal func getFlag(from countryCode: String) -> String {

    return countryCode
        .unicodeScalars
        .map({ 127397 + $0.value })
        .compactMap(UnicodeScalar.init)
        .map(String.init)
        .joined()
}

答案 3 :(得分:4)

对亚特答案的两个优化。

  • 无需通过Swift 4中的嵌套字符串
  • 为了避免传递小写字符串,我添加了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
}

答案 4 :(得分:2)

更多地了解哑光答案

Swift 2版

public static func flag(countryCode: String) -> Character {
    let base = UnicodeScalar("").value - UnicodeScalar("A").value

    let string = countryCode.uppercaseString.unicodeScalars.reduce("") {
      var string = $0
      string.append(UnicodeScalar(base + $1.value))
      return string
    }

    return Character(string)
  }

Swift 3版本,取自https://github.com/onmyway133/Smile/blob/master/Sources/Smile.swift#L52

public func emoji(countryCode: String) -> Character {
  let base = UnicodeScalar("").value - UnicodeScalar("A").value

  var string = ""
  countryCode.uppercased().unicodeScalars.forEach {
    if let scala = UnicodeScalar(base + $0.value) {
      string.append(String(describing: scala))
    }
  }

  return Character(string)
}

答案 5 :(得分:2)

我知道这并不是所要的,但也许可以帮助某人:

var flagDictionary: [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": "??"
]

答案 6 :(得分:0)

对于更具功能性的方法,不使用可变变量,请使用:

private func flag(country: String) -> String {
    let base: UInt32 = 127397
    return country.unicodeScalars
        .flatMap({ UnicodeScalar(base + $0.value) })
        |> String.UnicodeScalarView.init
        |> String.init
}

|>运算符是函数应用程序运算符的位置,就像" pipe"为了更自然的阅读顺序:我们采用标量,将它们映射到新的标量,将其转换为视图,然后将其转换为字符串。

它的定义如下:

infix operator |> : MultiplicationPrecedence
func |> <T, U>(left: T, right: (T) -> U) -> U {
    return right(left)
}

如果没有自定义运算符,我们仍然可以在没有可变状态的情况下执行此操作:

private func flag(country: String) -> String {
    let base: UInt32 = 127397
    return String(String.UnicodeScalarView(
        country.unicodeScalars.flatMap({ UnicodeScalar(base + $0.value) })
    ))
}

但是恕我直言,这听起来有点&#34;向后&#34;,因为操作的自然流程既不会读出也不读取,而是读取两者。

相关问题