【问题标题】:UTF-8 NO-BREAK SPACE causing problems with NSXMLParserUTF-8 NO-BREAK SPACE 导致 NSXMLParser 出现问题
【发布时间】:2013-06-03 22:12:28
【问题描述】:

我正在解析一些 UTF8 文本,其中包含 UTF-8 NO-BREAK SPACE (C2A0) 而不是常规空格字符,这导致 NSXMLParser 出现问题。

例如,包含 3 个常规空格字符的“我是一个字符串”将作为一个完整的字符串传递给解析器:(NSXMLParser *)parser foundCharacters:(NSString *)string。

但是,包含 3 个 NO-BREAK-SPACES 而不是常规空格的“我是一个字符串”会导致 4 次解析器调用:(NSXMLParser *)parser foundCharacters:(NSString *)string 和 4 个子字符串。

我只想提取“我是一个字符串”,如果遇到这些 UTF8 字符,是否有任何巧妙的解决方案可以让 NSURLConnection 不将其分解为子字符串?

我无法控制输入 - 它来自服务器作为 UTF8 编码的 XML over HTTP。

【问题讨论】:

  • 这是 HTML 还是 XML?该文本周围是什么?标签?引号?文件中是否定义了 DTD?
  • 它的 XML 带有被标签包围的文本。
  • DTD 在顶部?类似于:
  • 嗨,是的,正如您所展示的那样。

标签: ios


【解决方案1】:

找到一些从未使用过的 Unicode 字符 - 一些符号 - 并使用 NSString 将空格字符更改为其他字符,然后提取您想要的内容,并对字符串进行反向编码。

编辑:假设您将网页作为 NSData 对象获取:

NSString *str = [[NSString alloc] initWithData:myData encoding:NSUTF8StringEncoding];
NSString *nStr = [str stringByReplacingOccurrencesOfString:@"\uC2A0" withString:@"\u2208"];
NSData *nData = [[nStr ]dataUsingEncoding:NSUTF8StringEncoding];
// do your parsing
// for each parsed string
NSString *nStr = [str stringByReplacingOccurrencesOfString:@"\u2208" withString: @"\uC2A0"];

这将在最后得到您的确切输入字符串。但也许你只是想忘记那些 Unicode 空格,把它们变成真正的空格:

NSString *nStr = [str stringByReplacingOccurrencesOfString:@"\u2208" withString: @" "];
NSString *str = [[NSString alloc] initWithData:myData encoding:NSUTF8StringEncoding];
NSString *nStr = [str stringByReplacingOccurrencesOfString:@"\uC2A0" withString:@"\u2208"];
NSData *nData = [[nStr ]dataUsingEncoding:NSUTF8StringEncoding];

您甚至可以查找双空格并用一个空格替换它们。

【讨论】:

  • 我不明白你的意思,在哪里改空格字符?我无法控制输入,它来自服务器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-25
  • 2015-11-04
  • 2020-08-09
  • 2019-02-25
  • 2017-07-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多