返回列表 發帖

[Xcode] [已解決] HTML Parser 中文字編碼問題

本帖最後由 Invictus 於 2010-6-11 10:03 編輯

各位好, 我想要做一個HTML Parser, 目前遇到中文字編碼處理的問題, 請各位指點一下.

以下是程式碼片段:
  1. NSURL *url = [NSURL URLWithString:@"http://www.google.com.tw"];
  2. NSData *data = [[NSData alloc] initWithContentsOfURL:url];
  3. NSString *string1 = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
  4. NSLog(@"%@", string1);
  5.                
  6. NSString *string2 = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  7. NSLog(@"%@", string2);
複製代碼
我想達成的只是把網頁的原始碼原封不動的在console上列印出來
string1可以印出幾乎所有的原始碼, 但中文字會變成像是§¹¥þ¤â¥U或是Áô¨pÅv¬Fµ¦的亂碼
而string2則是什麼都印不出來(null)



我已參考以下幾篇, 但似乎沒有我要的答案

如何判斷NSString是否為中文字?
http://dev.iphonetw.net/thread-2342-1-2.html

為何我的中文字看不了呢?
http://dev.iphonetw.net/thread-1809-1-8.html

NSString UTF8String 轉碼後 顯示的亂碼問題
http://dev.iphonetw.net/thread-1281-1-13.html

還請各位指點,感謝。
1. Console只能印UTF8的中文字,你轉成ASCII,所以是亂碼
2. string2的原因...官方文件寫的很清楚 Returns nil if the initialization fails for some reason (for example if data does not represent valid data for encoding).

用NSString的initWithContentsOfURL:usedEncoding:error:試試吧
回復 2# cjlin

謝謝您的回復, 以下是我試著用NSString的initWithContentsOfURL:usedEncoding:error:所寫的程式碼
  1. NSURL *url = [NSURL URLWithString:@"http://www.google.com.tw"];
  2.                 NSStringEncoding encoding;
  3.                 NSError *error = nil;
  4.                 NSString *string3 = [[NSString alloc] initWithContentsOfURL:url usedEncoding:&encoding error:&error];
  5.                 NSLog(@"%@", string3);
複製代碼
所得的結果還是null
請問還有哪些要改進之處? 謝謝各位。
所以你應該可以在error裡面看到錯在哪裡?
本帖最後由 Invictus 於 2010-6-9 10:51 編輯

回復 4# cjlin


謝謝您的回覆,原來NSError是這樣用的。

這段code
  1. NSURL *url = [NSURL URLWithString:@"http://www.google.com.tw"];
  2. NSStringEncoding encoding;
  3. NSError *error = nil;
  4. NSString *string3 = [[NSString alloc] initWithContentsOfURL:url usedEncoding:&encoding error:&error];
  5. NSLog(@"%@", string3);
  6. NSLog(@"code: %d", [error code]);
  7. NSLog(@"domain: %@", [error domain]);
  8. NSLog(@"localizedDescription: %@", [error localizedDescription]);
複製代碼
所印出的的結果是
2010-06-09 10:26:50.978 MyHtmlParser01[724:207] (null)
2010-06-09 10:26:50.979 MyHtmlParser01[724:207] code: 264
2010-06-09 10:26:50.979 MyHtmlParser01[724:207] domain: NSCocoaErrorDomain
2010-06-09 10:26:50.981 MyHtmlParser01[724:207] localizedDescription: Operation could not be completed. (Cocoa error 264.)



經由Google搜尋"Cocoa error 264"只找到一個討論串
http://www.iphonedevsdk.com/foru ... ted-characters.html
提問者也是在Parse HTML的過程中遇到非英文字串 (法文)
最後他解決的方法是
  1. NSData *data = [[NSData alloc] initWithContentsOfURL: [NSURL URLWithString: url] options: 0 error: &error];
  2. NSString *html = [[[NSString alloc] initWithData: data encoding: NSISOLatin1StringEncoding] autorelease];
複製代碼
我使用相同的code但把NSISOLatin1StringEncoding改成NSUTF8StringEncoding卻行不通, 連error都是null



我想應該是原始網頁內的編碼有非UTF-8的文字
www.google.com.tw原始碼最前面有註明charset是UTF-8
  1. <!doctype html><html><head><meta http-equiv="content-type" content="text/html; charset=UTF-8">
複製代碼
為什麼這樣還會錯呢? 謝謝指教.
這麼說好了,這些編碼都不是問題,
問題是你的測試目標http://www.google.com.tw會根據不同client給不同結果,
你用的是同一份資料做驗證嗎?還是用兩個不同的connection拿到的東西去比較?
我用NSString拿到的結果是big5,網頁裡寫的也是big5,指定UTF8就會發生錯誤是很正常的
回復 6# cjlin


哈囉, 謝謝您的回覆.

你用的是同一份資料做驗證嗎?還是用兩個不同的connection拿到的東西去比較?


這段看不太懂
我所做的是連上www.google.com.tw然後右鍵檢視原始碼
原始碼第一段有註明charset=UTF-8
<!doctype html><html><head><meta http-equiv="content-type" content="text/html; charset=UTF-8"
為何其內容還會是big5?

另外請問你是怎麼知道某個NSString的內容是big5編碼還是UTF-8? 謝謝。
本帖最後由 cjlin 於 2010-6-9 20:50 編輯

所以你不是用同一份資料做驗證啊...一個是iPhone或Simulator,另外一個是瀏覽器?
因為我拿到的是charset=big5,所以我才說編碼不是你的問題,問題是你的驗證方法

--------------------------------------------------------------------------------------------
我給你code,你自己看吧
  1.        
  2. NSData *googlePage = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:@"http://www.google.com.tw"]];
  3. char *rawData = malloc([googlePage length]);
  4. [googlePage getBytes:rawData        length:[googlePage length]];
  5. CFStringRef decodedString = CFStringCreateWithCString(NULL, rawData , kCFStringEncodingBig5);
  6. NSLog(@"%@", (NSString*)decodedString);
複製代碼
話說回來,console印不出來其實不是什麼特別的事...你加油 ^^"
所以你不是用同一份資料做驗證啊...一個是iPhone或Simulator,另外一個是瀏覽器?


你說的沒錯! 謝謝你的耐心解說。

我後來在其他地方也有找到類似的解法,附連結如下給有需要的人參考。
「iPhone解析非UTF-8的XML」
http://www.javaeye.com/topic/493525

感謝!
返回列表