4

CFStringTransform を使用して、ロシア語で入力された名前をクレジット カード処理用の安全な ASCII に音訳しようとしています。ただし、分音記号を取り除くと č が ac になり、これは実際には適切な音訳ではありません。とにかく、分音記号なしで CFStringTransform を使用できますか? つまり、ч は、ほぼすべての標準http://en.wikipedia.org/wiki/Romanization_of_Russianで想定されているように、ch を返す必要があります。

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
4

1 に答える 1

7

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]];
} 
于 2013-10-10T10:02:05.197 に答える