[英]iOS HTML Unicode to NSString?
我正在將Android應用移植到iOS上,我遇到了一個小問題。 我正在從網頁中提取HTML編碼數據,但有些數據以Unicode格式顯示以顯示外國字符...所以俄語中的字符(Летизамной)將被解析為"Лет..."
在android中我通過調用HTML.fromHTML()來解決這個問題。 iOS中有類似的東西嗎?
編寫自己的HTML實體解碼器非常容易。 只需掃描字符串,查找&,讀取以下內容;然后解釋結果。 如果是“amp”,“lt”,“gt”或“quot”,請將其替換為相關字符。 如果它以#開頭,則它是一個數字實體。 如果#后跟一個“x”,則將其余部分視為十六進制,否則視為十進制。 讀取數字,然后將字符插入到字符串中(如果您正在寫入NSMutableString
,則可以使用[str appendFormat:@"%C", thechar]
NSScanner
可以使字符串掃描非常簡單,特別是因為它已經知道如何讀取十六進制數字。
我只是掀起了一個應該為你做這個的功能。 注意,我實際上沒有測試過這個,所以你應該按照它的步伐運行它:
- (NSString *)stringByDecodingHTMLEntitiesInString:(NSString *)input {
NSMutableString *results = [NSMutableString string];
NSScanner *scanner = [NSScanner scannerWithString:input];
[scanner setCharactersToBeSkipped:nil];
while (![scanner isAtEnd]) {
NSString *temp;
if ([scanner scanUpToString:@"&" intoString:&temp]) {
[results appendString:temp];
}
if ([scanner scanString:@"&" intoString:NULL]) {
BOOL valid = YES;
unsigned c = 0;
NSUInteger savedLocation = [scanner scanLocation];
if ([scanner scanString:@"#" intoString:NULL]) {
// it's a numeric entity
if ([scanner scanString:@"x" intoString:NULL]) {
// hexadecimal
unsigned int value;
if ([scanner scanHexInt:&value]) {
c = value;
} else {
valid = NO;
}
} else {
// decimal
int value;
if ([scanner scanInt:&value] && value >= 0) {
c = value;
} else {
valid = NO;
}
}
if (![scanner scanString:@";" intoString:NULL]) {
// not ;-terminated, bail out and emit the whole entity
valid = NO;
}
} else {
if (![scanner scanUpToString:@";" intoString:&temp]) {
// &; is not a valid entity
valid = NO;
} else if (![scanner scanString:@";" intoString:NULL]) {
// there was no trailing ;
valid = NO;
} else if ([temp isEqualToString:@"amp"]) {
c = '&';
} else if ([temp isEqualToString:@"quot"]) {
c = '"';
} else if ([temp isEqualToString:@"lt"]) {
c = '<';
} else if ([temp isEqualToString:@"gt"]) {
c = '>';
} else {
// unknown entity
valid = NO;
}
}
if (!valid) {
// we errored, just emit the whole thing raw
[results appendString:[input substringWithRange:NSMakeRange(savedLocation, [scanner scanLocation]-savedLocation)]];
} else {
[results appendFormat:@"%C", c];
}
}
}
return results;
}
&#(number);
HTML(和XML)中的構造稱為字符引用。 它不是特定於Unicode的,除了HTML中的所有字符都是用Unicode定義的,無論是逐字包含還是編碼為字符或實體引用。 (實體引用是看起來像é
的命名引用é
或者&
並且如果你正在抓取HTML頁面,你肯定也必須處理那些。)
標准庫中沒有用於解碼字符或實體引用的函數。 有關解碼HTML文本內容的方法,請參閱此問題 。 如果您只有字符引用和標准XML實體,例如&
你可以利用NSXMLParser
解析<element>
+ yourstring + </element>
,但這不會處理像é
這樣的特定於HTML的實體é
。
通常,屏幕抓取最好使用適當的HTML解析器,而不是字符串黑客。 這會將所有文本內容轉換為文本節點,轉換字符和實體引用。 但是,標准庫中沒有可用的HTML解析器。 如果目標頁面是格式良好的獨立XHTML,則可以再次使用NSXMLParser
。 否則你可能想嘗試libxml2,它提供HTML解析器和XML。 有些背景,請參閱此問題 。
如果你從網站獲得數據,你將有一個NS(Mutable)Data
對象作為你的接收緩沖區。 您只需通過以下方式將NSData
轉換為NSString
:
NSString *myString = [[NSString alloc] initWithData:myRecvData usingEncoding:NSUnicodeStringEncoding]
如果您的服務器是以Unicode發送的。 如果您的服務器正在發送utf-8或其他服務器,那么您還必須調整接收代碼中的stringencoding。
編輯:看看這個如此線程 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.