【问题标题】:NSJSONSerializzation not reading UTF8 correctly [duplicate]NSJSONSerializzation 未正确读取 UTF8 [重复]
【发布时间】:2015-07-29 03:15:15
【问题描述】:

我正在从 URL 读取 JSON。它是 UTF8 格式的。当我加载 UITableView 它显示不正确的字符。 请在第 2 行找到随附的屏幕截图

读取数据的代码如下:

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 格式?

谢谢你帮助我

达里奥

【问题讨论】:

  • 建议:使用AFNetworking进行URL调用
  • 检查该 URL 返回的内容,它返回完美的 JSON,不包含任何 URL 编码的字符。看起来很像您在解析 JSON 数据和将文本放入表视图之间的某个时间点自己添加它们。
  • 进一步检查,您没有告诉我们 JSON 数据包含 URL,并且您正在下载 那些 URL,它们不包含任何 JSON。因此,您遇到的问题与 JSON 无关,也与 UTF-8 无关。

标签: ios objective-c uitableview utf-8


【解决方案1】:

您的数据使用 HTML 方式存储特殊字符。它与 UTF-8 不同,是一种使用 ASCII 码点添加特殊字符的方法。

请参阅http://www.w3.org/TR/html4/charset.html#h-5.3 了解它们的工作原理。 HTML character decoding in Objective-C / Cocoa Touch 回答了一种解码它们的方法。

【讨论】:

  • 谢谢,该链接提供了我使用和测试过的解决方案!
【解决方案2】:

您是指第二行的“'”部分吗?那是 HTML,你可以通过 url 编码来转换它。你可以试试这个方法:

- (NSString *)stringByReplacingPercentEscapesUsingEncoding:(NSStringEncoding)encoding

【讨论】:

  • stringByReplacingPercentEscapesUsingEncoding: 用于将%20 之类的内容替换为空格。它不适用于 HTML 实体。
【解决方案3】:

' 是一个字符的 HTML 转义;这根本与 UTF-8 无关。

要么要求您的 WebService 停止使用它们的百分比转义对 HTML 实体进行编码,因为它们通常不需要这样做……或者您可以使用一种方法来删除它们,就像下面的代码:

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

不幸的是,这似乎只适用于以十六进制代码点表示的 HTML 实体,例如 ',而不是以十进制代​​码点表示的 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 提供商从源头修复它,因为他们一开始就没有正当理由这样做)

【讨论】:

    猜你喜欢
    • 2013-05-15
    • 2014-07-13
    • 2016-10-12
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-04
    • 2011-06-01
    相关资源
    最近更新 更多