絵文字カウント

##Swiftの文字カウントがよくないので対策方法のメモ
[*追記あり 2015/12/20*](http://qiita.com/miyakeryo/items/60b00c7541db9fa2182b#%E8%BF%BD%E8%A8%98-20151220)

何がよくないかっていうと国旗の絵文字が複数並んでたら、1文字とカウントしてしまうとこ。

```swift
var str = "abc"
println("\(str): \(count(str))") 
// abc: 3　　　　 …問題ない

str = "🇯🇵"
println("\(str): \(count(str))") 
// 🇯🇵: 1　　　　　…問題ない

str = "🇯🇵🇧🇷🇨🇭"
println("\(str): \(count(str))") 
// 🇯🇵🇧🇷🇨🇭: 1　　　…どうかしてる
```

とりあえず、こんな感じで対策してみた

```swift
extension String
{
    func unicodeCount() -> UInt
    {
        var cnt2:UInt = 0
        for c in self.unicodeScalars {
            switch c.value {
            // Combining Diacritical Marks for Symbols
            case 0x20D0...0x20FF:
                break
            // Variation Selectors
            case 0xFE00...0xFE0F:
                break
            // Regional Indicator symbols
            case 0x1F1E6...0x1F1FF:
                cnt2++
            default:
                cnt2 += 2
            }
        }
        return cnt2/2
    }
}
```

```swift
var str = "abc"
println("\(str): \(str.unicodeCount())") 
// abc: 3　　　　 …問題ない

str = "🇯🇵"
println("\(str): \(str.unicodeCount())") 
// 🇯🇵: 1　　　　　…問題ない

str = "🇯🇵🇧🇷🇨🇭"
println("\(str): \(str.unicodeCount())") 
// 🇯🇵🇧🇷🇨🇭: 3　　　…問題ない
```

いいんじゃないの。文字化けするから書いてないけど囲み文字もOK。

Objective-Cだったらこれでいいんだけどね
http://qiita.com/matsuokah/items/a435e3c86318a793d307

###環境
* OS X 10.10.3
* Xcode 6.3

##追記 2015/12/20
Swift 2.1 になったことだし、新しい絵文字も増えたので。

まず、普通のカウント

```swift
var str = "abc"
print("\(str): \(str.characters.count)")
// abc: 3　　　　 …問題ない

str = "🇯🇵"
print("\(str): \(str.characters.count)")
// 🇯🇵: 1　　　　　…問題ない

str = "🇯🇵🇧🇷🇨🇭"
print("\(str): \(str.characters.count)")
// 🇯🇵🇧🇷🇨🇭: 1　　  …やっぱりどうかしてる

str = "🤕🤒"
print("\(str): \(str.characters.count)")
// 🤕🤒: 2　　　 …問題ない

str = "🖖🏾🤘🏿🖐🏻"
print("\(str): \(str.characters.count)")
// 🖖🏾🤘🏿🖐🏻: 6　　  …どうかしてる
```
最後のは 6文字であってるんじゃないかって思うかもしれないけど、
![スクリーンショット 2015-12-20 17.33.09.png](https://qiita-image-store.s3.amazonaws.com/0/8050/6e84d301-9fa3-bf8e-14e0-2ceee0a3d84e.png)
Xcode 7.2 で見たらやっぱりどうかしてる（iOS 9.1 でも同じ）

新しい絵文字も入ったので対策の方も修正。

```swift
extension String
{
    func unicodeCount() -> UInt
    {
        var cnt2:UInt = 0
        for c in self.unicodeScalars {
            switch c.value {
            // Combining Diacritical Marks for Symbols
            case 0x20D0...0x20FF:
                break
            // Variation Selectors
            case 0xFE00...0xFE0F:
                break
            // Regional Indicator symbols
            case 0x1F1E6...0x1F1FF:
                cnt2 += 1
            // Fitzpatrick skin type
            case 0x1F3FB...0x1F3FF:
                break
            default:
                cnt2 += 2
            }
        }
        return cnt2/2
    }
}
```

やってみた。

```swift
var str = "abc"
print("\(str): \(str.unicodeCount())")
// abc: 3　　　　 …問題ない

str = "🇯🇵"
print("\(str): \(str.unicodeCount())")
// 🇯🇵: 1　　　　　…問題ない

str = "🇯🇵🇧🇷🇨🇭"
print("\(str): \(str.unicodeCount())")
// 🇯🇵🇧🇷🇨🇭: 3　　  …問題ない

str = "🤕🤒"
print("\(str): \(str.unicodeCount())")
// 🤕🤒: 2　　　 …問題ない

str = "🖖🏾🤘🏿🖐🏻"
print("\(str): \(str.unicodeCount())")
// 🖖🏾🤘🏿🖐🏻: 3　　 …問題ない
```

![スクリーンショット 2015-12-20 17.46.28.png](https://qiita-image-store.s3.amazonaws.com/0/8050/bb99572c-6593-57ea-f670-87437c292e34.png)

うん。ええんちゃう。