Search code examples
c#asp.netiosobjective-cunicode

IOS - Unicode Unsign


I have a function written in C#, i want to convert it to objective-c. How to do it?

public static string UnicodeUnSign(string s)
{
    const string uniChars = "àáảãạâầấẩẫậăằắẳẵặèéẻẽẹêềếểễệđìíỉĩịòóỏõọôồốổỗộơờớởỡợùúủũụưừứửữựỳýỷỹỵÀÁẢÃẠÂẦẤẨẪẬĂẰẮẲẴẶÈÉẺẼẸÊỀẾỂỄỆĐÌÍỈĨỊÒÓỎÕỌÔỒỐỔỖỘƠỜỚỞỠỢÙÚỦŨỤƯỪỨỬỮỰỲÝỶỸỴÂĂĐÔƠƯ";
    const string koDauChars = "aaaaaaaaaaaaaaaaaeeeeeeeeeeediiiiiooooooooooooooooouuuuuuuuuuuyyyyyAAAAAAAAAAAAAAAAAEEEEEEEEEEEDIIIOOOOOOOOOOOOOOOOOOOUUUUUUUUUUUYYYYYAADOOU";

    if (string.IsNullOrEmpty(s))
    {
        return s;
    }

    string retVal = String.Empty;
    for (int i = 0; i < s.Length; i++)
    {
        int pos = uniChars.IndexOf(s[i].ToString());
        if (pos >= 0)
            retVal += koDauChars[pos];
        else
            retVal += s[i];
    }
    return retVal;
}

Solution

  • You could use the CoreFoundation CFStringTransform function which does almost all transformations from your list. Only "đ" and "Đ" have to be handled separately:

    NSString *UnicodeUnsign(NSString *s)
    {
        NSMutableString *result = [s mutableCopy];
        // __bridge only required if you compile with ARC:
        CFStringTransform((__bridge CFMutableStringRef)result, NULL, kCFStringTransformStripCombiningMarks, NO);
    
        [result replaceOccurrencesOfString:@"đ" withString:@"d" options:0 range:NSMakeRange(0, [result length])];
        [result replaceOccurrencesOfString:@"Đ" withString:@"D" options:0 range:NSMakeRange(0, [result length])];
    
        return result;
    }
    

    Example:

    NSString *input = @"Hễllö Wõrld! - ếểễệđìíỉĩịòó";
    NSString *output = UnicodeUnsign(input);
    NSLog(@"%@", output);
    // Output: Hello World! - eeeediiiiioo