我正在制作一个应用程序来检查我学校的成绩和作业。在查看作业时,您可以看到以下内容:
但是服务器实际上返回一个包含常规字符的字符串,而中文字符保持常规的UTF-8编码格式:
我如何解析Swift中的原始String并解码任何UTF-8编码的字符。 。我很难找到甚至在网上找到解决方案。只是一个FYI,我无法改变后端的任何内容。
答案 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 北京")) //->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 北京".decodingNumericEntities) //->from 北京
请注意,上述代码不适用于命名字符实体,例如>
或&
。
(来自スタック·オーバーフロー的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>北</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: 北