2013-05-14 28 views
4

我正在尝试使用CFStringTransform将用俄语输入的名字音译为用于信用卡处理的安全ASCII。但是,当删除变音符号变成c时,这实际上不是一个好的音译。无论如何,我可以使用CFStringTransform,没有变音符号?换句话说,ч,应该返回通道,因为它应该在几乎所有标准http://en.wikipedia.org/wiki/Romanization_of_Russian如何使用CFStringTransform正确音译西里尔文,而不使用变音符号?

NSMutableString *name = [@"романчук" mutableCopy]; 
CFMutableStringRef nameRef = (__bridge CFMutableStringRef)name; 
CFStringTransform(nameRef, NULL, kCFStringTransformToLatin, false); //name is romančuk 
CFStringTransform(nameRef, NULL, kCFStringTransformStripCombiningMarks, false); //name is now romancuk 
+1

,如果你发现在CF/ICU无解,那么链接中的音译表就足够小而可以DIY了。 – justin 2013-05-14 13:14:21

回答

6

创建类别的NSString并添加下列方法:

- (NSString *)toLatinWithDictionary 
{ 
    NSMutableString *newString = [NSMutableString string]; 
    NSRange range; 
    NSString *symbol; 
    NSString *newSymbol; 

    for (NSUInteger i = 0; i < [self length]; i ++) 
    { 
     // Take regular symbol 
     range = NSMakeRange(i, 1); 
     symbol = [self substringWithRange:range]; 
     newSymbol = [self transliterateChar:symbol]; 
     if (newSymbol != nil) 
     { 
      [newString appendString:newSymbol]; 
     } 
     else 
     { 
      [newString appendString:symbol]; 
     } 
    } 
    return [NSString stringWithString:newString]; 
} 

- (NSString *)transliterateChar:(NSString *)symbol 
{ 
    // For simlicity there is only 
    NSArray *cyrillicChars = @[@"а", @"б", @"в", @"г", @"д", @"е", @"ё", @"ж", @"з", @"и", @"й", @"к", @"л", @"м", @"н", @"о", @"п", @"р", @"с", @"т", @"у", @"ф", @"х", @"ц", @"ч", @"ш", @"щ", @"ъ", @"ы", @"ь", @"э", @"ю", @"я"]; 
    NSArray *latinChars = @[@"a", @"b", @"v", @"g", @"d", @"e", @"yo", @"zh", @"z", @"i", @"y", @"k", @"l", @"m", @"n", @"o", @"p", @"r", @"s", @"t", @"u", @"f", @"h", @"ts", @"ch", @"sh", @"shch", @"'", @"y", @"'", @"e", @"yu", @"ya"]; 
    NSDictionary *convertDict = [NSDictionary dictionaryWithObjects:latinChars 
                  forKeys:cyrillicChars]; 
    return [convertDict valueForKey:[symbol lowercaseString]]; 
}