从API转换Swift中String中的任何UTF-8编码字符

时间:2016-10-01 01:49:51

标签: ios swift string utf-8 nsstring

我正在制作一个应用程序来检查我学校的成绩和作业。在查看作业时,您可以看到以下内容: Image from school web page

但是服务器实际上返回一个包含常规字符的字符串,而中文字符保持常规的UTF-8编码格式: Raw string shown in the app

我如何解析Swift中的原始String并解码任何UTF-8编码的字符。 。我很难找到甚至在网上找到解决方案。只是一个FYI,我无法改变后端的任何内容。

3 个答案:

答案 0 :(得分:5)

您可以使用NSAttributedString将这些HTML实体转换为字符串。

let htmlString = "test北京的test"
if let htmldata = htmlString.dataUsingEncoding(NSUTF8StringEncoding), let attributedString = try? NSAttributedString(data: htmldata, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType], documentAttributes: nil) {
    let finalString = attributedString.string
    print(finalString)
    //output: test北京的test
}

答案 1 :(得分:2)

如果您只需要转换数字实体,则可以使用CFStringTransform(_:_:_:_:)

  

声明

func CFStringTransform(_ string: CFMutableString!, 
                     _ range: UnsafeMutablePointer<CFRange>!, 
                     _ transform: CFString!, 
                     _ reverse: Bool) -> Bool
     

...

     

<强> transform

     

标识要应用的转换的CFString对象。为一个   有效值列表,请参阅CFStringTransform的转换标识符。   在macOS 10.4及更高版本中,您还可以使用任何有效的ICU转换ID   在ICU User Guide for Transforms中定义。

(代码在Swift 3 / Xcode 8,iOS 8.4模拟器中测试。)

func decodeNumericEntities(_ input: String) -> String {
    let nsMutableString = NSMutableString(string: input)
    CFStringTransform(nsMutableString, nil, "Any-Hex/XML10" as CFString, true)
    return nsMutableString as String
}

print(decodeNumericEntities("from &#21271;&#20140;")) //->from 北京

或者如果您更喜欢计算属性和扩展名:

extension String {
    var decodingNumericEntities: String {
        let nsMutableString = NSMutableString(string: self)
        CFStringTransform(nsMutableString, nil, "Any-Hex/XML10" as CFString, true)
        return nsMutableString as String
    }
}

print("from &#21271;&#20140;".decodingNumericEntities) //->from 北京

请注意,上述代码不适用于命名字符实体,例如&gt;&amp;

(来自スタック·オーバーフロー的this thread(日语StackOverflow)。)

答案 2 :(得分:1)

您有一些HTML / XML实体。您可以将它们转换为“普通文本”,如下所示:

// Class declaration in ViewController.h
@interface ViewController : UIViewController <NSXMLParserDelegate>
// Implementation of methods in ViewController.m
- (void)viewDidLoad {
    [super viewDidLoad];

    NSString *xml = @"<root>&#21271;</root>";
    NSData *data = [NSData dataWithBytes:[xml UTF8String] length:[xml length]];
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];
    parser.delegate = self;

    [parser parse];
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    NSLog(@"string: %@", string);
}

日志输出为:

string: 北