ifish/Ifish/controllers/IfishTabControllers/消息/IfishIMFiles/Sessions/Util/Spelling/NTESPinyinConverter.m

131 lines
3.2 KiB
Objective-C

//
// NTESPinyinConverter.m
// NIM
//
// Created by amao on 10/15/13.
// Copyright (c) 2013 Netease. All rights reserved.
//
#import "NTESPinyinConverter.h"
#define kHanziMin 0x4E00
#define kHanziMax 0x9FA5
@interface NTESPinyinConverter ()
{
int *_codeIndex;
char *_pinyin;
BOOL _inited;
}
@end
@implementation NTESPinyinConverter
+ (NTESPinyinConverter *)sharedInstance
{
static NTESPinyinConverter *instance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
instance = [[NTESPinyinConverter alloc] init];
});
return instance;
}
- (id)init
{
_codeIndex = NULL;
_pinyin = NULL;
NSString *filepath = [[NSBundle mainBundle] pathForResource:@"pinyin"
ofType:@"bin"];
if (filepath)
{
while (true)
{
FILE *fp = fopen([filepath UTF8String], "rb");
if (fp)
{
int hanZiNumber = 0,pinyinSize = 0;
size_t size = fread(&hanZiNumber, 4, 1, fp);
if (size != 1)
{
assert(0);
NSLog(@"Read HanziNumber Failed,%zu",size);
break;
}
size = fread(&pinyinSize, 4, 1, fp);
if (size != 1)
{
assert(0);
NSLog(@"Read pinyinSize Failed,%zu",size);
break;
}
if (hanZiNumber != kHanziMax - kHanziMin + 1)
{
assert(0);
NSLog(@"Read pinyinSize Failed,%zu",size);
}
_codeIndex = (int*)calloc(hanZiNumber, sizeof(int));
_pinyin = (char*)calloc(pinyinSize, sizeof(char));
size = fread(_codeIndex, 4, hanZiNumber, fp);
if (size != hanZiNumber)
{
NSLog(@"Read CodeIndex Failed,%zu",size);
break;
}
size = fread(_pinyin, 1, pinyinSize, fp);
if (size != pinyinSize)
{
NSLog(@"Read Pinyin Failed,%zu",size);
break;
}
fclose(fp);
_inited = YES;
}
else
{
assert(0);
NSLog(@"Open Pinyin File Failed %@",filepath);
}
break;
}
}
return self;
}
- (NSString *)pinyin: (unichar)p
{
if (p >= kHanziMin && p <= kHanziMax)
{
return [NSString stringWithUTF8String:_pinyin + _codeIndex[p - kHanziMin]] ;
}
else
{
return [[NSString alloc]initWithCharacters:&p length:1];
}
}
- (NSString *)toPinyin: (NSString *)source
{
if ([source length] == 0 || !_inited)
{
return @"";
}
NSMutableString *pinyin = [[NSMutableString alloc] init];
for (NSInteger i = 0; i < [source length]; i++)
{
unichar p = [source characterAtIndex:i];
[pinyin appendString:[self pinyin:p]];
}
return pinyin;
}
@end