131 lines
3.2 KiB
Objective-C
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
|