2010-09-28 1 views
2

У меня проблема с кодировкой ASIHttpRequest. Когда я получаю URL-адрес, данные возвращаются полностью, за исключением небольшой проблемы с кодировкой.Проблема с кодировкой ASIHttpRequest

Это мой код:

- (void)fetchGamesForCategory 
{ 
    NSString *url_string = [[NSString alloc] initWithFormat:url_match, theCategory._id]; 

    NSURL *url = [NSURL URLWithString:url_string]; 
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
    [request startSynchronous]; 

    NSError *error = [request error]; 
    if (!error) { 
     NSString *response = [request responseString]; 

     NSLog(@"response: %@", response); 

     NSData *data = [response dataUsingEncoding:NSUTF8StringEncoding]; 

     NSString *errorDesc = nil; 
     NSPropertyListFormat format; 
     NSDictionary * dict = (NSDictionary*)[NSPropertyListSerialization 
               propertyListFromData:data 
               mutabilityOption:NSPropertyListMutableContainersAndLeaves 
               format:&format 
               errorDescription:&errorDesc]; 

     NSDictionary *categoryListPathDictionary = [[NSDictionary alloc] initWithDictionary:dict]; 

     categoryMatchList *categoryMatchListFile = [[[categoryMatchList alloc] initWithDictionary:categoryListPathDictionary] retain]; 
     matchArray = [categoryMatchListFile getMatchListXmlSet]; 

     [self loadPage]; 
    } 
} 

И это мой результат:

2010-09-28 21:49:35.970 oddsApp[46429:190f] response: <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist> 
    <dict> 
     <key>matches</key> 
     <array> 
      <dict> 
       <key>name</key> 
       <string>Gais - Häcken</string> 
       <key>date</key> 
       <string>2010-09-29 18:00</string> 
       <key>id</key> 
       <string>156</string> 
       <key>odds</key> 
       <dict> 
        <key>1</key> 
        <string>2.6</string> 
        <key>X</key> 
        <string>3.28</string> 
        <key>2</key> 
        <string>2.862</string> 
       </dict> 
      </dict> 
     </array> 
    </dict> 
</plist> 

Как вы можете видеть, кодирование облажался на <string>Gais - Häcken</string>, Allthough правильно при отображении страницы в браузере: FireFox screenshot

кто-то знает, что это неправильно?

+3

Прекрасный комментарий в ASIHTTPRequest: // Если заголовок Content-Type определен мы будем использовать это, иначе мы будем использовать defaultStringEncoding (по умолчанию это NSISOLatin1StringEncoding) ». Это технически корректно для HTTP (текстовое кодирование по умолчанию соответствует ISO-8859-1), но не соответствует тому, что делают все остальные. Вы можете выполнить '[request setResponseEncoding: NSUTF8StringEncoding]', но это немного взломан. –

+0

Да, я читал это, но я думаю, я не понял его достаточно хорошо. Я искал «setEncoding», но теперь я знаю, почему я его не нашел. Благодарю. –

ответ

8

Что делать, если вы сначала не преобразуете ответ в строку?

NSData *data = request.responseData; 
+0

Хорошая идея, я буду. –

+1

Хорошая идея, но что вы делаете с данными? Я возвращаю объект JSON, который показывает поврежденные значения. – bashan

+0

В строку: NSString * responceString = [[NSString alloc] initWithData: responseData encoding: NSUTF8StringEncoding]; –

0

Ребята, я tryied все и не имели успеха:

ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:self.urlString]]; 
request.delegate = self; 
[request setDefaultResponseEncoding:NSUTF8StringEncoding]; 
[request setResponseEncoding:NSUTF8StringEncoding]; 
[request setRequestMethod:@"PUT"]; 
[request addRequestHeader:@"Accept" value:@"application/xml"]; 
[request addRequestHeader:@"Content-Type" value:@"application/xml; charset=UTF-8;"]; 

ли кто-нибудь solce та же проблема с кодировками? alt text

+0

Ваши данные кодируются URLEncoded, а не UTF8. С кодировкой символов приведет к «Häcken» вместо «Häcken». Вам нужно URLDecode ваши данные. Не знаю, как все же. –

+0

Я мог бы сделать [.. stringByReplacingPercentEscapesUsingEncoding: NSUTF8StringEncoding]); , но на самом деле это не процент. Любые другие идеи? – slatvick

+0

Кто-нибудь нашел исправление для этого? – Slee

0

У меня была аналогичная проблема, и это установило для меня:

stringByAddingPercentEscapesUsingEncoding 

См документации здесь: https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/Reference/NSString.html

Шахта была на самом деле для почтовых ценностей, которые начали с чем напоминающим URL кодирования, как говорят что-нибудь в этом списке: http://www.w3schools.com/tags/ref_urlencode.asp