2015-05-17 7 views
0

Я читаю JSON по URL-адресу. Это UTF8 отформатирован. Когда я загружаю UITableView, он показывает неправильные символы. Пожалуйста прилагается скриншот в строке 2 enter image description hereNSJSONSerializzation не читает UTF8 правильно

код, который считывает данные заключается в следующем:

NSURL *myURL=[NSURL  URLWithString:@"http://www.bancariromani.it/cecadm/newClass/modules/rh/index.php?id_cup=15&json=1"]; 

NSError *error; 
NSData *myData=[[NSData alloc]initWithContentsOfURL:myURL]; 
if(!myData){ 

    return; 

} 

NSArray *jasonArray=[NSJSONSerialization JSONObjectWithData:myData options:kNilOptions error:&error]; 

Я также попытался это без везения:

NSURL *myURL=[NSURL URLWithString:@"http://www.bancariromani.it/cecadm/newClass/modules/rh/index.php?id_cup=15&json=1"]; 

NSError *error; 
NSString *string = [NSString stringWithContentsOfURL:myURL encoding:NSISOLatin1StringEncoding error:nil]; 

NSData *myData = [string dataUsingEncoding:NSUTF8StringEncoding]; 

if(!myData){ 

    return; 

} 
NSArray *jasonArray=[NSJSONSerialization JSONObjectWithData:myData options:kNilOptions error:&error]; 

Где я я теряю формат UTF8?

Спасибо за помощь мне

Дарио

+0

Рекомендация: Используйте [AFNetworking] (https://github.com/AFNetworking/AFNetworking) для URL-вызовов –

+0

Проверяя, что возвращает этот URL, он отлично возвращается тонкий JSON, не содержащий URL-кодированных символов. Это очень похоже на то, что вы добавляете их сами в какой-то момент между разбором данных JSON и помещением текста в представление таблицы. – gnasher729

+0

Кроме того, вы не сообщили нам, что данные JSON содержат URL-адреса, и вы загружаете _those_ URL-адреса, которые не содержат никакого JSON. Таким образом, проблема, которая у вас есть, не имеет ничего общего с JSON, и вообще ничего общего с UTF-8. – gnasher729

ответ

2

Ваши данные использует HTML-способ для хранения специальных символов. Он отличается от UTF-8 и является способом добавления специальных символов с использованием ASCII-кодовых точек.

См. http://www.w3.org/TR/html4/charset.html#h-5.3, как они работают. Способ их декодирования отвечает в HTML character decoding in Objective-C/Cocoa Touch.

+0

Спасибо, ссылка предоставила решение, которое я использовал и протестировал! – Dario

0

Вы имеете в виду "& # 039;" часть на втором ряду? Это HTML, и вы можете преобразовать его, выполнив кодировку url. Вы можете попробовать этот метод:

- (NSString *)stringByReplacingPercentEscapesUsingEncoding:(NSStringEncoding)encoding 
+2

'stringByReplacingPercentEscapesUsingEncoding:' предназначен для замены таких вещей, как '% 20' пробелу. Он не работает для объектов HTML. – rmaddy

0

Это ' является HTML-побег из характера; это совсем не связано с UTF-8.

Либо обратитесь к WebService, чтобы остановить кодирующий HTML сущности с их процентами, побегами, так как там нет вообще никакой необходимости для них, чтобы сделать это ... или вы можете использовать метод, чтобы удалить их, как с этим кодом:

NSMutableString* yourString = [… mutableCopy]; 
CFStringTransform((CFMutableStringRef)yourString, NULL, kCFStringTransformToXMLHex, true); 
NSLog(@"transformed string: %@", yourString); 

К сожалению, это, похоже, работает только для HTML-объектов, выраженных как шестнадцатеричные кодовые точки, такие как ', а не те, которые выражаются в виде десятичных кодовых точек, например &#039.

Так вот пользовательский метод, чтобы сделать только, что (декодирование десятичной HTML-сущность):

NSString* decodeHTMLEntities(NSString* string) 
{ 
    NSRegularExpression* decimalEntity = [NSRegularExpression regularExpressionWithPattern:@"&#(\\d+);" options:0 error:nil]; 
    NSMutableString* resultString = [string mutableCopy]; 
    NSInteger __block offset = 0; 
    [decimalEntity enumerateMatchesInString:string options:0 range:NSMakeRange(0,string.length) 
           usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) 
    { 
     unsigned decimalCode = [string substringWithRange:[result rangeAtIndex:1]].intValue; 
     NSString* decodedChar = [NSString stringWithFormat:@"%C", (unichar)decimalCode]; 
     result = [result resultByAdjustingRangesWithOffset:offset]; 
     [resultString replaceCharactersInRange:result.range withString:decodedChar]; 
     offset += (NSInteger)decodedChar.length - (NSInteger)result.range.length; 
    }]; 
    return [resultString copy]; 
} 

(Конечно, было бы лучше, чтобы попросить ваш провайдер WebService, чтобы зафиксировать его на источнике, поскольку у них нет веских оснований для этого, в первую очередь)

Смежные вопросы