IOS - Unicode Unsign

Posted

技术标签:

【中文标题】IOS - Unicode Unsign【英文标题】: 【发布时间】:2013-03-01 08:57:25 【问题描述】:

我有一个用 C# 编写的函数,我想将它转换为 Objective-c。怎么做?

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;

【问题讨论】:

我想第一步是学习Objective-C 就我个人而言,我在使用Xamarin stack of tools 为 ios 和 OS X 编写 C# 应用程序方面有很好的经验。 不,你不明白,我要转换上面的函数删除符号,我不想用C#创建app原生I​​OS。 【参考方案1】:

不借助核心基础:

#import <Foundation/Foundation.h>

int main (int argc, const char *argv[]) 
   NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

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

   NSString *decomposed = [unicodeCharacters decomposedStringWithCanonicalMapping];
   NSLocale *usLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease];

   NSString *cleaned = [decomposed stringByFoldingWithOptions:NSDiacriticInsensitiveSearch locale:usLocale];
   cleaned = [cleaned stringByReplacingOccurrencesOfString:@"đ" withString:@"d"];
   cleaned = [cleaned stringByReplacingOccurrencesOfString:@"Đ" withString:@"D"];
   NSLog (@"%@", cleaned);

   [pool drain];
   return 0;

【讨论】:

好答案!我知道decomposedStringWithCanonicalMapping,但不知道stringByFoldingWithOptions。 - 是否需要先分解字符串?至少这个问题的输入字符串似乎没有什么区别。 主要作为安全预防措施。这完全取决于字符串的来源以及是否希望文本保持一致。根据 Apple 的 QA 文章,只要您只使用 Mac,这可能并不重要。 developer.apple.com/library/mac/#qa/qa1235/_index.html【参考方案2】:

您可以使用 CoreFoundation CFStringTransform 函数,它几乎可以完成列表中的所有转换。只有“đ”和“Đ”需要分开处理:

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;

例子:

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

【讨论】:

Đ 和 đ 有什么特别之处,这意味着它们需要特殊处理? 我的转换中的“ł”也有同样的问题。 @macbirdie:CFStringTransform 似乎完全删除了“Unicode 数据库”中定义的“组合标记”,比较 ***.com/questions/16187077/… 或 ***.com/questions/17418443/… 与“Ø”的类似问题.我没有进一步调查,但这个线程 ***.com/questions/9376621/… 似乎包含有用的信息。 是的,看起来像。感谢您挖掘细节。 :)

以上是关于IOS - Unicode Unsign的主要内容,如果未能解决你的问题,请参考以下文章

在iOS5中以不同方式绘制Unicode字符

将 Unicode 笑脸转换为 nsstring ios

转义 iOS 的 Unicode 字符

iOS应用程序名称中的Unicode字符?

在 Web 上显示 iOS emoji unicode 字符

iOS关于JSONKit解析Unicode字符内容出错,问题出在u0000