簡體   English   中英

iOS HTML Unicode到NSString?

[英]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定義的,無論是逐字包含還是編碼為字符或實體引用。 (實體引用是看起來像&eacute;的命名引用&eacute;或者&amp;並且如果你正在抓取HTML頁面,你肯定也必須處理那些。)

標准庫中沒有用於解碼字符或實體引用的函數。 有關解碼HTML文本內容的方法,請參閱此問題 如果您只有字符引用和標准XML實體,例如&amp; 你可以利用NSXMLParser解析<element> + yourstring + </element> ,但這不會處理像&eacute;這樣的特定於HTML的實體&eacute;

通常,屏幕抓取最好使用適當的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM