每一@metatation的回答,被抵消者为tes,而不是 character。 贵国数据库中的案文可能是UTF8-encoded Unicode,在这种情况下,任何单一非ASCIIcharacter由多个bytes代表。 非经共体特性的例子包括有acc素(à、ö等)、智能引言、非拉丁特性的特性(加雷克、热带风暴、多数亚洲特征等)等。
如果Kallite数据库中的 by子是UTF8-encoded Unicode strings,你可以确定统法协会的真正编码特性,但以下述方式抵消:
NSUInteger characterOffsetForByteOffsetInUTF8String(NSUInteger byteOffset, const char *string) {
/*
* UTF-8 represents ASCII characters in a single byte. Characters with a code
* point from U+0080 upwards are represented as multiple bytes. The first byte
* always has the two most significant bits set (i.e. 11xxxxxx). All subsequent
* bytes have the most significant bit set, the next most significant bit unset
* (i.e. 10xxxxxx).
*
* We use that here to determine character offsets. We step through the first
* `byteOffset` bytes of `string`, incrementing the character offset result
* every time we come across a byte that doesn t match 10xxxxxx, i.e. where
* (byte & 11000000) != 10000000
*
* See also: http://en.wikipedia.org/wiki/UTF-8#Description
*/
NSUInteger characterOffset = 0;
for (NSUInteger i = 0; i < byteOffset; i++) {
char c = string[i];
if ((c & 0xc0) != 0x80) {
characterOffset++;
}
}
return characterOffset;
}
洞穴:如果你重新使用被抵消的特性,将其编入<条码>NSString,同时铭记<条码>在星号上使用UTF-16,因此,其代码高于U+FFFF的特性以16-bit值的pair表示。 一般来说,你在案文内容上胜诉,但如果你关注特别模糊的特性,或某些非文字性质的话。 统法协会可以代表Emojis,因此,上述算法需要改进,以适应这些算法。
(The Code snippet s from ,这一地雷项目感到可以自由使用。)