【问题标题】:Why would NSURL Connection Received Data contain bytes, but on conversion to NSString, the string is Null?为什么 NSURL 连接接收数据包含字节,但在转换为 NSString 时,字符串为 Null?
【发布时间】:2014-07-16 20:32:07
【问题描述】:

我从其他帖子中尝试了很多其他解决方案,但没有成功从我收到的数据中获取字符串。除了我在另一个文件上运行几乎一个副本并且它工作 100% 的时间。它甚至从完全相同的 php 文件中获取数据。

+ (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{

    [imagesTableData appendData:data];
    NSString *dataStringImages = [[NSString alloc] initWithData:imagesTableData encoding:NSUTF8StringEncoding];
    receivedDataImages = [NSString stringWithFormat:@"%@%@",receivedDataImages,dataStringImages];

}

+ (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    NSLog(@"%lu -- %@",(unsigned long)[imagesTableData length],receivedDataImages);
}

NSLog 输出:14938 -- (null)

我已通过将 encoding:NSUTF8StringEncoding 更改为 encoding:NSASCIIStringEncoding 解决了我的问题。请参阅下面我对 didReceiveData 的修复:

+ (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{

    [imagesTableData appendData:data];
    NSString *dataStringImages = [[NSString alloc] initWithData:imagesTableData encoding:NSASCIIStringEncoding];
    receivedDataImages = [NSString stringWithFormat:@"%@%@",receivedDataImages,dataStringImages];

}

现在我不知道为什么要解决这个问题?让我解释一下是什么让我如此困惑。我有两个不同但相似的实用程序文件,用于接收数据进行解析,然后将它们放入数据库中。

问题在于两个文件都连接到同一个 PHP 文件,并且 PHP 文件以完全相同的方式输出数据,但数据量不同。为什么需要“NSUTF8StringEncoding”和另一个“NSASCIIStringEncoding”的编码?

查看我的代码和下面每个实用程序文件的相关数据输出。

实用程序文件 A

+ (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{

    [placesTableData appendData:data];
    NSString *dataStringPlaces = [[NSString alloc] initWithData:placesTableData encoding:NSUTF8StringEncoding];
    receivedDataPlaces = [NSString stringWithFormat:@"%@%@",receivedDataPlaces,dataStringPlaces];

}

实用数据 A

MERRYMAN|Merryman Performing Arts Center|LOC|40.698903|-99.085779|||Mention this coupon when ordering for 20% off tickets at the Merryman Performing Arts Center.|308-698-8297||http://www.merrymancenter.org|225 West 22nd Street Kearney, NE 68845||0000-00-00 00:00:00|0000-00-00 00:00:00|0|2014-07-16 21:29:51~~

实用程序文件 B

+ (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{

    [imagesTableData appendData:data];
    NSString *dataStringImages = [[NSString alloc] initWithData:imagesTableData encoding:NSASCIIStringEncoding];
    receivedDataImages = [NSString stringWithFormat:@"%@%@",receivedDataImages,dataStringImages];

}

实用程序输出 B

WSGFFJKM|LIPS Printing Service 25% Off|LIPSNewCustomerAd2014_KearneyApp.jpg||LIPSPRINTING2|2014-07-16 23:46:07~~

如果您对如何或是否应该重写我的问题有任何意见,请在 cmets 中提出建议。

【问题讨论】:

    标签: ios encoding nsstring nsurlconnection nsdata


    【解决方案1】:

    documentationinitWithData:encoding:

    如果由于某种原因初始化失败(例如 如果数据不代表有效的编码数据)。

    仔细检查您的数据是否具有正确的编码或字符串。您可能希望推迟将数据转换为字符串,直到 连接也完成加载。

    【讨论】:

    • 他不是必须等到所有数据都下载后才能查看吗?他正在做的是试图在下载中查看数据。我想知道如果他将数据放到 NSString 方法连接完成下载会发生什么
    • 也许吧。这完全取决于下载的数据是否完全映射到编码。使用 UTF 8,如果所有字符都是单字节,它应该可以在任何时候正常转换。如果多字节字符被拆分,则可能会导致问题。考虑到这是一个图像列表,我怀疑这些数据在整个下载之前是否有用。我确实继续添加了该建议。
    • 在php文件中我使用了“header('Content-Type: text/html; charset=utf-8');”没有变化。
    • @Esko918 基本上我在 didReceiveData 方法中所做的是将数据附加到我的字符串 receivedDataImages。在我的方法中,connectionDidFinishLoading 是我输出完整字符串和总字节数的地方,您可以在我的 NSLog 输出中看到。
    • @Cedric 是的,但是在构建字符串的过程中会做两件事:1. 存在无法将数据转换为字符串的风险。 2. 你丢掉了很多你可能不需要做的工作。如果你 connection:didReceiveData: 被调用了 100 次,那么你正在尝试创建 100 个字符串,但实际上只使用了 1 个。
    猜你喜欢
    • 1970-01-01
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多