如果存在特殊字符,NSMutableData 到 NSString 的转换将失败

发布于 2024-10-05 05:27:32 字数 9510 浏览 3 评论 0原文

我正在编写一个应用程序,通过 http 服务器接口与 DirecTV 接收器进行交互。我能够查询设备并获得 SJON 格式的响应。

这是我的示例代码:

- (NSDictionary *) readDVRData
{
    NSMutableData *rData = [[NSMutableData alloc] initWithContentsOfFile:@"./data"];
    //NSLog(@"rData = %@",rData);
    NSString *rString = [[NSString alloc] initWithData:rData encoding:NSUTF8StringEncoding];
    NSLog(@"rString = %@",rString);
    NSError *error;
    SBJSON *json = [[SBJSON new] autorelease];
    NSDictionary *response = [json objectWithString:rString error:&error];
    //NSLog(@"response = %@",response);
    return response;    
}

出于测试目的,我将响应保存到数据文件中,并在上面的示例中从中读取。 通过以下方式从 NSMutableData 到 NSString 的转换

NSString *rString = [[NSString alloc] initWithData:rData encoding:NSUTF8StringEncoding];

如果以下字符就位,则 将失败。 È鲜奶油。作为参考,这是南方公园录音中的剧集标题和描述。

如果我将此字符更改为大写“E”,则转换有效。我应该使用不同的方法来捕获这样的东西吗?或者有没有一种简单的方法来删除这样的字符?请记住,我事先不会知道它是否是重音符号或其他可能导致转换失败的东西。

谢谢, Dave

数据文件片段(如果需要)。我会包含整个文本,但它会将字符限制推至 30000 以上。

{
      "groupId": "1 1 381C3",
      "groupTitle": "South Park",
      "isRecording": false,
      "numItems": 10,
      "numNewItems": 10,
      "programs": [
        {
          "callsign": "COMHD",
          "contentId": "1 1 381C3 198",
          "description": "\"CrÈme Fraiche\" Animation, Comedy. (2010)  Trey Parker,  Matt Stone. Randy's obsession with the Food Network forces Sharon to explore a new interest of her own. Series.",
          "duration": 1800,
          "episodeTitle": "CrÈme Fraiche",
          "expiration": "0",
          "isHd": true,
          "isPartial": false,
          "isPpv": false,
          "isRecording": false,
          "isViewed": false,
          "isVod": false,
          "keepUntilFull": true,
          "major": 249,
          "minor": 65535,
          "programId": "6937756",
          "rating": "TV-MA-L",
          "startTime": 1290056400,
          "title": "South Park",
          "uniqueId": "5397375192530140068"
        },
        {
          "callsign": "COMHD",
          "contentId": "1 1 381C3 197",
          "description": "\"Coon vs. Coon & Friends\" Animation, Comedy. (2010)  Trey Parker,  Matt Stone. Coon and Friends find themselves at the mercy of Cartman who now has the dark lord doing his bidding; Kenny wrestles with the curse of his super power. Series.",
          "duration": 1800,
          "episodeTitle": "Coon vs. Coon & Friends",
          "expiration": "0",
          "isHd": true,
          "isPartial": false,
          "isPpv": false,
          "isRecording": false,
          "isViewed": false,
          "isVod": false,
          "keepUntilFull": true,
          "major": 249,
          "minor": 65535,
          "programId": "6918387",
          "rating": "TV-MA-L",
          "startTime": 1289444400,
          "title": "South Park",
          "uniqueId": "8476957599452610419"
        },
        {
          "callsign": "COMHD",
          "contentId": "1 1 381C3 196",
          "description": "\"Mysterion Rises\" Animation, Comedy. (2010)  Trey Parker,  Matt Stone. Mysterion's true identity is revealed; scorned by fellow superheroes, one goes out for revenge. Series.",
          "duration": 1800,
          "episodeTitle": "Mysterion Rises",
          "expiration": "0",
          "isHd": true,
          "isPartial": false,
          "isPpv": false,
          "isRecording": false,
          "isViewed": false,
          "isVod": false,
          "keepUntilFull": true,
          "major": 249,
          "minor": 65535,
          "programId": "6896823",
          "rating": "TV-MA-L",
          "startTime": 1288843200,
          "title": "South Park",
          "uniqueId": "2113731123121326471"
        },
        {
          "callsign": "COMHD",
          "contentId": "1 1 381C3 0",
          "description": "Animation, Comedy.  Trey Parker,  Matt Stone. The adventures of four boys who live in South Park, Colo. Series.",
          "duration": 1800,
          "episodeTitle": "",
          "expiration": "0",
          "isHd": true,
          "isPartial": false,
          "isPpv": false,
          "isRecording": false,
          "isViewed": false,
          "isVod": false,
          "keepUntilFull": true,
          "major": 249,
          "minor": 65535,
          "programId": "6830127",
          "rating": "TV-MA-L",
          "startTime": 1288751400,
          "title": "South Park",
          "uniqueId": "2166056034991125062"
        },
        {
          "callsign": "COMHD",
          "contentId": "1 1 381C3 195",
          "description": "\"Coon 2: Hindsight\" Animation, Comedy. (2010)  Trey Parker,  Matt Stone. Coon and friends set out to help the victims of BP's latest catastrophic drilling accident in the Gulf. Series.",
          "duration": 1800,
          "episodeTitle": "Coon 2: Hindsight",
          "expiration": "0",
          "isHd": true,
          "isPartial": false,
          "isPpv": false,
          "isRecording": false,
          "isViewed": false,
          "isVod": false,
          "keepUntilFull": true,
          "major": 249,
          "minor": 65535,
          "programId": "6876407",
          "rating": "TV-MA-L",
          "startTime": 1288238400,
          "title": "South Park",
          "uniqueId": "8615834721021879366"
        },
        {
          "callsign": "COMHD",
          "contentId": "1 1 381C3 194",
          "description": "\"Insheeption\" Animation, Comedy. (2010)  Trey Parker,  Matt Stone. When Stan is sent to the school counselor because he's holding on to an obscene number of useless possessions, he realizes that Mr. Mackey had a hoarding disorder too. Series.",
          "duration": 1783,
          "episodeTitle": "Insheeption",
          "expiration": "0",
          "isHd": true,
          "isPartial": false,
          "isPpv": false,
          "isRecording": false,
          "isViewed": false,
          "isVod": false,
          "keepUntilFull": true,
          "major": 249,
          "minor": 65535,
          "programId": "6857628",
          "rating": "TV-MA-L",
          "startTime": 1287626416,
          "title": "South Park",
          "uniqueId": "1547798106243799673"
        },
        {
          "callsign": "COMHD",
          "contentId": "1 1 381C3 193",
          "description": "\"It's a Jersey Thing\" Animation, Comedy. (2010)  Trey Parker,  Matt Stone. New Jersey is taking over the nation one state at a time, Randy and the boys take a stand as the Jerseyites approach South Park. Series.",
          "duration": 1800,
          "episodeTitle": "It's a Jersey Thing",
          "expiration": "0",
          "isHd": true,
          "isPartial": false,
          "isPpv": false,
          "isRecording": false,
          "isViewed": false,
          "isVod": false,
          "keepUntilFull": true,
          "major": 249,
          "minor": 65535,
          "programId": "6839243",
          "rating": "TV-MA-L",
          "startTime": 1287028800,
          "title": "South Park",
          "uniqueId": "8123622337314668826"
        },
        {
          "callsign": "COMHD",
          "contentId": "1 1 381C3 193",
          "description": "\"It's a Jersey Thing\" Animation, Comedy. (2010)  Trey Parker,  Matt Stone. New Jersey is taking over the nation one state at a time, Randy and the boys take a stand as the Jerseyites approach South Park. Series.",
          "duration": 1784,
          "episodeTitle": "It's a Jersey Thing",
          "expiration": "0",
          "isHd": true,
          "isPartial": false,
          "isPpv": false,
          "isRecording": false,
          "isViewed": false,
          "isVod": false,
          "keepUntilFull": true,
          "major": 249,
          "minor": 65535,
          "programId": "6839243",
          "rating": "TV-MA-L",
          "startTime": 1287021615,
          "title": "South Park",
          "uniqueId": "949183344652655207"
        },
        {
          "callsign": "COMHD",
          "contentId": "1 1 381C3 0",
          "description": "Animation, Comedy.  Trey Parker,  Matt Stone. The adventures of four boys who live in South Park, Colo. Series.",
          "duration": 1800,
          "episodeTitle": "",
          "expiration": "0",
          "isHd": true,
          "isPartial": false,
          "isPpv": false,
          "isRecording": false,
          "isViewed": false,
          "isVod": false,
          "keepUntilFull": true,
          "major": 249,
          "minor": 65535,
          "programId": "6830127",
          "rating": "TV-MA-L",
          "startTime": 1286937000,
          "title": "South Park",
          "uniqueId": "7841891672059226043"
        },
        {
          "callsign": "COMHD",
          "contentId": "1 1 381C3 0",
          "description": "Animation, Comedy.  Trey Parker,  Matt Stone. The adventures of four boys who live in South Park, Colo. Series.",
          "duration": 1800,
          "episodeTitle": "",
          "expiration": "0",
          "isHd": true,
          "isPartial": false,
          "isPpv": false,
          "isRecording": false,
          "isViewed": false,
          "isVod": false,
          "keepUntilFull": true,
          "major": 249,
          "minor": 65535,
          "programId": "6830127",
          "rating": "TV-MA-L",
          "startTime": 1286856000,
          "title": "South Park",
          "uniqueId": "3872435936942587460"
        }
      ]
    }

I'm writing an app to interact with a DirecTV receiver through the http server interface. I'm able to query the device and get the SJON formatted response.

Here is my sample code:

- (NSDictionary *) readDVRData
{
    NSMutableData *rData = [[NSMutableData alloc] initWithContentsOfFile:@"./data"];
    //NSLog(@"rData = %@",rData);
    NSString *rString = [[NSString alloc] initWithData:rData encoding:NSUTF8StringEncoding];
    NSLog(@"rString = %@",rString);
    NSError *error;
    SBJSON *json = [[SBJSON new] autorelease];
    NSDictionary *response = [json objectWithString:rString error:&error];
    //NSLog(@"response = %@",response);
    return response;    
}

For testing purposes, I saved the response to the data file and I'm reading from it in the example above. The conversion from NSMutableData to NSString via:

NSString *rString = [[NSString alloc] initWithData:rData encoding:NSUTF8StringEncoding];

fails if the following character is in place. È as in CrÈme Fraiche. For reference this was in the episodeTitle and description from a South Park recording.

If I change this character to just an upper case "E", the conversion works. Is there a different method I should use to catch something like this? Or is there a simple way to remove characters like this? Please keep in mind I will not know before hand if it's and accent mark or something different that might cause the conversion to fail.

Thanks,
Dave

Snippet of data file if that is needed. I would include the entire text, but it pushes the character limit above the 30000 limit.

{
      "groupId": "1 1 381C3",
      "groupTitle": "South Park",
      "isRecording": false,
      "numItems": 10,
      "numNewItems": 10,
      "programs": [
        {
          "callsign": "COMHD",
          "contentId": "1 1 381C3 198",
          "description": "\"CrÈme Fraiche\" Animation, Comedy. (2010)  Trey Parker,  Matt Stone. Randy's obsession with the Food Network forces Sharon to explore a new interest of her own. Series.",
          "duration": 1800,
          "episodeTitle": "CrÈme Fraiche",
          "expiration": "0",
          "isHd": true,
          "isPartial": false,
          "isPpv": false,
          "isRecording": false,
          "isViewed": false,
          "isVod": false,
          "keepUntilFull": true,
          "major": 249,
          "minor": 65535,
          "programId": "6937756",
          "rating": "TV-MA-L",
          "startTime": 1290056400,
          "title": "South Park",
          "uniqueId": "5397375192530140068"
        },
        {
          "callsign": "COMHD",
          "contentId": "1 1 381C3 197",
          "description": "\"Coon vs. Coon & Friends\" Animation, Comedy. (2010)  Trey Parker,  Matt Stone. Coon and Friends find themselves at the mercy of Cartman who now has the dark lord doing his bidding; Kenny wrestles with the curse of his super power. Series.",
          "duration": 1800,
          "episodeTitle": "Coon vs. Coon & Friends",
          "expiration": "0",
          "isHd": true,
          "isPartial": false,
          "isPpv": false,
          "isRecording": false,
          "isViewed": false,
          "isVod": false,
          "keepUntilFull": true,
          "major": 249,
          "minor": 65535,
          "programId": "6918387",
          "rating": "TV-MA-L",
          "startTime": 1289444400,
          "title": "South Park",
          "uniqueId": "8476957599452610419"
        },
        {
          "callsign": "COMHD",
          "contentId": "1 1 381C3 196",
          "description": "\"Mysterion Rises\" Animation, Comedy. (2010)  Trey Parker,  Matt Stone. Mysterion's true identity is revealed; scorned by fellow superheroes, one goes out for revenge. Series.",
          "duration": 1800,
          "episodeTitle": "Mysterion Rises",
          "expiration": "0",
          "isHd": true,
          "isPartial": false,
          "isPpv": false,
          "isRecording": false,
          "isViewed": false,
          "isVod": false,
          "keepUntilFull": true,
          "major": 249,
          "minor": 65535,
          "programId": "6896823",
          "rating": "TV-MA-L",
          "startTime": 1288843200,
          "title": "South Park",
          "uniqueId": "2113731123121326471"
        },
        {
          "callsign": "COMHD",
          "contentId": "1 1 381C3 0",
          "description": "Animation, Comedy.  Trey Parker,  Matt Stone. The adventures of four boys who live in South Park, Colo. Series.",
          "duration": 1800,
          "episodeTitle": "",
          "expiration": "0",
          "isHd": true,
          "isPartial": false,
          "isPpv": false,
          "isRecording": false,
          "isViewed": false,
          "isVod": false,
          "keepUntilFull": true,
          "major": 249,
          "minor": 65535,
          "programId": "6830127",
          "rating": "TV-MA-L",
          "startTime": 1288751400,
          "title": "South Park",
          "uniqueId": "2166056034991125062"
        },
        {
          "callsign": "COMHD",
          "contentId": "1 1 381C3 195",
          "description": "\"Coon 2: Hindsight\" Animation, Comedy. (2010)  Trey Parker,  Matt Stone. Coon and friends set out to help the victims of BP's latest catastrophic drilling accident in the Gulf. Series.",
          "duration": 1800,
          "episodeTitle": "Coon 2: Hindsight",
          "expiration": "0",
          "isHd": true,
          "isPartial": false,
          "isPpv": false,
          "isRecording": false,
          "isViewed": false,
          "isVod": false,
          "keepUntilFull": true,
          "major": 249,
          "minor": 65535,
          "programId": "6876407",
          "rating": "TV-MA-L",
          "startTime": 1288238400,
          "title": "South Park",
          "uniqueId": "8615834721021879366"
        },
        {
          "callsign": "COMHD",
          "contentId": "1 1 381C3 194",
          "description": "\"Insheeption\" Animation, Comedy. (2010)  Trey Parker,  Matt Stone. When Stan is sent to the school counselor because he's holding on to an obscene number of useless possessions, he realizes that Mr. Mackey had a hoarding disorder too. Series.",
          "duration": 1783,
          "episodeTitle": "Insheeption",
          "expiration": "0",
          "isHd": true,
          "isPartial": false,
          "isPpv": false,
          "isRecording": false,
          "isViewed": false,
          "isVod": false,
          "keepUntilFull": true,
          "major": 249,
          "minor": 65535,
          "programId": "6857628",
          "rating": "TV-MA-L",
          "startTime": 1287626416,
          "title": "South Park",
          "uniqueId": "1547798106243799673"
        },
        {
          "callsign": "COMHD",
          "contentId": "1 1 381C3 193",
          "description": "\"It's a Jersey Thing\" Animation, Comedy. (2010)  Trey Parker,  Matt Stone. New Jersey is taking over the nation one state at a time, Randy and the boys take a stand as the Jerseyites approach South Park. Series.",
          "duration": 1800,
          "episodeTitle": "It's a Jersey Thing",
          "expiration": "0",
          "isHd": true,
          "isPartial": false,
          "isPpv": false,
          "isRecording": false,
          "isViewed": false,
          "isVod": false,
          "keepUntilFull": true,
          "major": 249,
          "minor": 65535,
          "programId": "6839243",
          "rating": "TV-MA-L",
          "startTime": 1287028800,
          "title": "South Park",
          "uniqueId": "8123622337314668826"
        },
        {
          "callsign": "COMHD",
          "contentId": "1 1 381C3 193",
          "description": "\"It's a Jersey Thing\" Animation, Comedy. (2010)  Trey Parker,  Matt Stone. New Jersey is taking over the nation one state at a time, Randy and the boys take a stand as the Jerseyites approach South Park. Series.",
          "duration": 1784,
          "episodeTitle": "It's a Jersey Thing",
          "expiration": "0",
          "isHd": true,
          "isPartial": false,
          "isPpv": false,
          "isRecording": false,
          "isViewed": false,
          "isVod": false,
          "keepUntilFull": true,
          "major": 249,
          "minor": 65535,
          "programId": "6839243",
          "rating": "TV-MA-L",
          "startTime": 1287021615,
          "title": "South Park",
          "uniqueId": "949183344652655207"
        },
        {
          "callsign": "COMHD",
          "contentId": "1 1 381C3 0",
          "description": "Animation, Comedy.  Trey Parker,  Matt Stone. The adventures of four boys who live in South Park, Colo. Series.",
          "duration": 1800,
          "episodeTitle": "",
          "expiration": "0",
          "isHd": true,
          "isPartial": false,
          "isPpv": false,
          "isRecording": false,
          "isViewed": false,
          "isVod": false,
          "keepUntilFull": true,
          "major": 249,
          "minor": 65535,
          "programId": "6830127",
          "rating": "TV-MA-L",
          "startTime": 1286937000,
          "title": "South Park",
          "uniqueId": "7841891672059226043"
        },
        {
          "callsign": "COMHD",
          "contentId": "1 1 381C3 0",
          "description": "Animation, Comedy.  Trey Parker,  Matt Stone. The adventures of four boys who live in South Park, Colo. Series.",
          "duration": 1800,
          "episodeTitle": "",
          "expiration": "0",
          "isHd": true,
          "isPartial": false,
          "isPpv": false,
          "isRecording": false,
          "isViewed": false,
          "isVod": false,
          "keepUntilFull": true,
          "major": 249,
          "minor": 65535,
          "programId": "6830127",
          "rating": "TV-MA-L",
          "startTime": 1286856000,
          "title": "South Park",
          "uniqueId": "3872435936942587460"
        }
      ]
    }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

梦归所梦 2024-10-12 05:27:32

您是否尝试过其他编码,例如 NISOLatin1StringEncoding?

Have you tried other encodings, such as NSISOLatin1StringEncoding?

月隐月明月朦胧 2024-10-12 05:27:32

这可能是网络服务器的编码问题。您期待 UTF-8 数据,但我敢打赌,这不是他们发送给您的数据。尝试使用 [NSString stringWithContentsOfFile:] 进行阅读,看看是否有任何变化。

编译器将抛出警告,因为该方法已被弃用。事实上,您可以使用 stringWithContentsOfFile:usedEncoding:error: 来代替,但我和其他人报告说,对于未完美编码的数据(即 90% 的网络数据),它似乎不如旧方法有效。 :-))。

It's likely an encoding problem from the web server. You're expecting UTF-8 data, but I bet you that's not what they are sending you. Try reading using [NSString stringWithContentsOfFile:] instead and see if anything changes.

The compiler will throw a warning because that method is deprecated. In fact, you could use stringWithContentsOfFile:usedEncoding:error: instead, but I and others have reported that it doesn't seem to work as well as the old method for data that is not perfectly encoded (that is, 90% of the web :-)).

陪我终i 2024-10-12 05:27:32

检查 DirecTV 单元响应中的 HTTP 标头。它可能没有使用 UTF-8。找出它正在使用哪种编码,然后向 initWithData:encoding: 提供正确的常量。

您可以使用命令 curl -i http://directv-data-url 来请参阅 HTTP 标头。

Check the HTTP headers in the DirecTV unit's response. It is probably not using UTF-8. Figure out which encoding it is using, then supply the correct constant to initWithData:encoding:.

You can use the command curl -i http://directv-data-url to see the HTTP headers.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文