获取UTF8中的字符串长度

时间:2016-01-22 16:09:33

标签: ios swift

如何以UTF-8编码形式(PHP的mb_strlen(.., 'UTF-8')等效形式)获取字符串的长度(不是字节数)?

我尝试了string.characters.count,但它没有为表情符号等特定字符返回正确的长度。

示例:

let s = "✌️"
print(s.characters.count) // prints 2, but should print 3.

2 个答案:

答案 0 :(得分:6)

您可以使用.utf8属性访问字符串的UTF-8编码。使用count来获取字符串中的UTF-8代码单元数:

let string = "\u{1f603}" // One of the smiley face emojis...

print(string.utf8.count) // prints "4"

根据您编辑的问题,您可能正在寻找的是用于对字符串进行编码的UnicodeScalar个数。您可以使用unicodeScalars属性访问该属性:

let s = "✌️"
print(s.unicodeScalars.count) // prints 3

每个人都感到困惑的原因是因为你的原始问题要求UTF-8编码形式的字符串长度。你真正想要的答案与UTF-8编码形式的字符串长度无关。

我认为您对Unicode“扩展字形集群”,Unicode代码点和可用于编码Unicode代码点的各种编码(如UTF-8)之间的区别感到困惑。

Swift中的Character表示Unicode称为“扩展字形集群”。也就是说,它是一个单一的视觉角色,即使它由多个Unicode代码点组成。

Unicode代码点是单个语言符号,具有32位值。两个或多个Unicode代码点可以组合在一起以创建单个Character。在Swift中,Unicode代码点由UnicodeScalar类型表示。

当需要存储字符串或通过互联网发送字符串,或者将其转换为由字节表示的数据时,您必须决定如何对其进行编码。有各种编码,最常见的可能是UTF-8,它将字符串编码为一系列UInt8值。

这只是三个概念之间差异的简短片段。这实际上是一个非常有趣的主题,如果你谷歌的一些条款,你会发现更多的好信息。

答案 1 :(得分:3)

let str = "ačŘ"
print("str has \(str.characters.count) characters") // 3
print("and \(str.utf8.count) bytes as encoded in UTF-8") // 5

更新(根据您的笔记)

let s = "✌️"

let arr:[UInt8] = [226, 156, 140, 240, 159, 143, 191, 239, 184, 143]
var arrCchar = arr.map { (uint8) -> Int8 in
    Int8(bitPattern: uint8)
}
arrCchar += [0] // to be null terminated

let str = String.fromCString(&arrCchar)
print(str) // Optional("✌️")
s == str // TRUE !!!!

字符

s.characters.forEach { (c) -> () in
    let str = String(c)
    print(str.utf8.map{$0}, "which represents character: ", c)
    str.unicodeScalars.forEach({ (u) -> () in
        print("composed from unicode scalar(s): ", u.debugDescription)
    })
}
/*
[226, 156, 140] which represents character:  ✌
composed from unicode scalar(s):  "\u{270C}"
[240, 159, 143, 191, 239, 184, 143] which represents character:  ️
composed from unicode scalar(s):  "\u{0001F3FF}"
composed from unicode scalar(s):  "\u{FE0F}"
*/ 

Unicode中的每个字符都可以由一个或多个unicode标量表示。 unicode标量是字符或修饰符的唯一21位数字(和名称),例如U + 0061用于LOWERCASE LATIN LETTER A(" a"),或U + 1F425用于FRONT-FACING BABY CHICK(" \ U0001f425")。         将Unicode字符串写入文本文件或其他存储时,这些unicode标量将以多种Unicode定义的格式之一进行编码。每种格式都以小块(称为代码单元)对字符串进行编码。这些包括UTF-8格式(将字符串编码为8位代码单元)和UTF-16格式(将字符串编码为16位代码单元)。

//从Apple Developer swift编程指南中复制