2010-02-22 24 views
1

當我獲取任何網頁的源代碼時,無論使用什麼編碼,我總是以&# - 字符(比如©或®)代替實際字符他們自己。這也適用於外國字符(例如瑞典語中的åäö),我必須從「& Aring」等解析)。iPhone SDK - stringWithContentsOfUrl HTML源代碼中的ASCII字符

我使用

+stringWithContentsOfUrl: encoding: error; 

獲取來源,並嘗試了幾種不同的編碼如NSUTF8StringEncoding和NSASCIIStringEncoding,但似乎沒有影響最終結果的字符串。

任何想法/提示/解決方案非常感謝!我寧願不必實現整個ASCII表,並替換每個字符的所有發生......在此先感謝!

問候

回答

0

你確定他們原本不是Å形式?嘗試先在瀏覽器中查看源代碼。

+0

該網頁看起來不錯,但我不得不相信有一個比這更好的方法:http://stackoverflow.com/questions/659602/objective-c-html-escape-unescape – user278647 2010-02-22 12:23:51

+0

爲了澄清,網頁源代碼顯示&# - 字符,但我希望它們在NSString中具有相同的效果(如在Web瀏覽器中顯示的那樣)。 – user278647 2010-02-22 12:27:08

+0

@user:如果它們原本是'Å'形式,並且您想將它們轉換爲'Å',那麼否,沒有比這更好的了。 – kennytm 2010-02-22 12:28:03

0

真的,真的很糟糕。我想直接轉換它,上面的解決方案並不是很好,所以我只寫了自己的ASCII轉換器(靜態)類。工作原本應該本地工作(雖然我必須自己填寫ascii表...)

想法優化? (「ASCII」是一個靜態的NSDictionary)

@implementation InternetHelper 

+(NSString *)HTMLSourceFromUrlWithString:(NSString *)str convertASCII:(BOOL)state 
{ 
    NSURL *url = [NSURL URLWithString:str]; 
    NSString *source = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil]; 

    if (state) 
     source = [InternetHelper ConvertASCIICharactersInString:source]; 

    return source; 
} 

+(NSString *)ConvertASCIICharactersInString:(NSString *)str 
{ 
    NSString *ret = [NSString stringWithString:str]; 

    if (!ASCII) 
    { 
     NSString *path = [[NSBundle mainBundle] pathForResource:kASCIICharacterTableFilename ofType:kFileFormat]; 
     ASCII = [[NSDictionary alloc] initWithContentsOfFile:path]; 
    } 

    for (id key in ASCII) 
    { 
     ret = [ret stringByReplacingOccurrencesOfString:key withString:[ASCII objectForKey:key]]; 
    } 

    return ret; 
}  

@end 
+0

ASCII並不意味着你認爲它的意思。它是一種編碼(並且是一個非常小的編碼);它與SGML或XML實體引用無關。此外,有一個更簡單,更簡單的方法來做到這一點;看到我的答案。 – 2010-02-23 11:39:18

1

我使用

+stringWithContentsOfUrl: encoding: error; 

獲取來源,並嘗試了幾種不同的編碼如NSUTF8StringEncoding和NSASCIIStringEncoding,但似乎沒有任何影響最終結果字符串。

您誤解了encoding:論點的用途。該方法需要以某種方式將字節轉換爲字符;編碼告訴它什麼字節序列描述哪些字符。您需要確保編碼與資源數據的編碼相匹配。

實體引用是一個SGML/XML的東西。 SGML和XML是而不是編碼;它們是標記語言語法。 stringWithContentsOfURL:encoding:error:及其堂兄弟們不會嘗試以任何方式解析字符序列(語法),這就是他們將一個字符序列(一個實體引用)轉換爲另一個序列(實體,實際上意味着單個字符字符,即被引用)。

您可以使用the CFXMLCreateStringByUnescapingEntities function將實體引用轉換爲未轉義字符。它需要一個CFString,它是一個NSString(toll-free bridging),並返回一個CFString,它是一個NSString。

+0

謝謝,我會檢查一下。 – user278647 2010-03-02 15:49:55