// 判断是否是Unicode字符(非ascii字符),参数2为存储的字节数,适用于大端存储格式
- (BOOL)isUnicode:(const char)c andByteCount:(NSUInteger *)byteCount
{
int i = 0;
for (i = 7; (c >> i) & 1; i--);
if (i == 7) { // 是ascii 字符
*byteCount = 1;
return NO;
}
*byteCount = 7 - i; // 字节数
return YES;
}
// 字符串的长度
- (NSUInteger)length
{
char *p = (char*)_string;
NSUInteger count = 0; // 当前字符个数
NSUInteger byteCount = 0; // 当前字符的字节数
while (*p) // 默认是从字符的高地址读起
{
//int i = 0;
//for (i = 7; (*p >> i) & 1; i--); // 查找当前字节(是否有UTF-8的非ascii字符)
BOOL isUnicodeChar = [self isUnicode:*p andByteCount:&byteCount];
// 当前字符为 字母
if (/*i == 7*/isUnicodeChar == NO)
{
count++; // 字符个数加1
p++; // 指向下一个字节
} else if (/*i < 7*/isUnicodeChar == YES) // 当前字符为 汉字(或非ascio字符)
{
count++; // 字符数加1
p += /*(7 - i)*/ byteCount; // 指向下一个字符(跳过7 - i个字节)
}
}
return count;
}{
char *p = (char *)_string;
unichar num = 0; // 要返回的ascii值或unicode值
NSUInteger newIndex = 0; // 当前下标
//NSUInteger bit = 0; // 表示位数
NSUInteger byteCount = 0; // 字节数
BOOL isUnicodeChar; // 是否是ascii字符
while (newIndex != index) // 找到第index个字符(可能包含非ascii字符)
{
//for (bit = 7; (*p >> bit) & 1 ; bit--); // 判断当前字节是什么字符
isUnicodeChar = [self isUnicode:*p andByteCount:&byteCount];
if (/*bit == 7*/ isUnicodeChar == NO) { // 是ascii字符
p++;
newIndex++;
}
else if (/*bit < 7*/ isUnicodeChar == YES) // 不是ascii字符
{
p += /*7 - bit*/ byteCount; // 跳过 7 - bit 个字节数
newIndex++;
}
}
// 此时p已经指向了第index个字符的首地址
// 找到当前字符的ascii值或unicode值
//for (bit = 7; (*p >> bit) & 1 ; bit--);
isUnicodeChar = [self isUnicode:*p andByteCount:&byteCount];
if (/*bit == 7*/ isUnicodeChar == NO)
{
num = *p;
} else if (/*bit < 7*/ isUnicodeChar == YES)
{
NSUInteger Byte = /*7 - bit*/ byteCount; // 字节数
NSUInteger i = 8 - /*(7 - bit)*/ byteCount - 1; // 首个字节(最高字节)
NSUInteger d = 16;
while (Byte)
{
for (int j = (int)i; j >= 0; j--)
{
num += ((*p >> j) & 1) * pow(2, d--);
}
i = 5;
Byte--;
p++;
}
}
return num;
}