그림 문자 개수

14333 단어 SwiftiOS9

스위프트 글이 숫자가 안 나와서 대안 노트


추기 2015년 12월 20일입니다.
안 좋은 점이 있다면 국기의 그림과 문자가 여러 개 나란히 놓여 있으면 한 글자와 함께 계산하는 것이다.
var str = "abc"
println("\(str): \(count(str))") 
// abc: 3     …問題ない

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

str = "🇯🇵🇧🇷🇨🇭"
println("\(str): \(count(str))") 
// 🇯🇵🇧🇷🇨🇭: 1   …どうかしてる
어쨌든 이런 느낌으로 대책을 세우자
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
    }
}
var str = "abc"
println("\(str): \(str.unicodeCount())") 
// abc: 3     …問題ない

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

str = "🇯🇵🇧🇷🇨🇭"
println("\(str): \(str.unicodeCount())") 
// 🇯🇵🇧🇷🇨🇭: 3   …問題ない
좋잖아.낙서해야 해서 안 썼는데 동그라미도 돼요.
Objective-C라면 이렇게 하면 돼요.
http://qiita.com/matsuokah/items/a435e3c86318a793d307

컨디션

  • OS X 10.10.3
  • Xcode 6.3
  • 추기 2015/12/20


    스위프트 2.1로 바뀌었기 때문에 새로운 그림문자도 늘었다.
    우선 일반적인 계수
    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    …どうかしてる
    
    마지막에 여섯 글자라고 생각할 수도 있어요.

    Xcode7.2를 봤는데 역시 뭔가 이상해(iOS 9.1도 마찬가지)
    새로운 그림문자를 넣었기 때문에 대책도 수정됐다.
    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
        }
    }
    
    한번 해 보았다.
    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   …問題ない
    

    네.네.

    좋은 웹페이지 즐겨찾기