Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone NSXMLParser和BOM字节_Iphone_Cocoa_Nsxmlparser_Byte Order Mark_Nsxmlparsererrordomain - Fatal编程技术网

Iphone NSXMLParser和BOM字节

Iphone NSXMLParser和BOM字节,iphone,cocoa,nsxmlparser,byte-order-mark,nsxmlparsererrordomain,Iphone,Cocoa,Nsxmlparser,Byte Order Mark,Nsxmlparsererrordomain,我得到的xml文件是来自某个服务器的php查询的结果。当我将结果数据打印到控制台时,我得到的是结构良好的xml文件。当我尝试使用NSXMLParser解析它时,它返回NSXMLParserErrorDomain,代码为4-空文档。 我看到它无法解析的xml在关闭xml头的“>”标记之后就有BOM字节顺序标记序列。问题是如何摆脱BOM序列。我试图用这些BOM表字节创建一个字符串,如下所示: const UInt8 bom[3] = {0xEF, 0xBB, 0xBF}; NSStrin

我得到的xml文件是来自某个服务器的php查询的结果。当我将结果数据打印到控制台时,我得到的是结构良好的xml文件。当我尝试使用NSXMLParser解析它时,它返回NSXMLParserErrorDomain,代码为4-空文档。 我看到它无法解析的xml在关闭xml头的“>”标记之后就有BOM字节顺序标记序列。问题是如何摆脱BOM序列。我试图用这些BOM表字节创建一个字符串,如下所示:

    const   UInt8 bom[3] = {0xEF, 0xBB, 0xBF};
NSString    *bomString = [[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)bom length:3] encoding:NSUTF8StringEncoding];
NSString    *noBOMString = [theResult stringByReplacingOccurrencesOfString:bomString withString:@" "];
const   UInt8 bom[3] = {0xEF, 0xBB, 0xBF};
NSString    *bomString = [[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)bom length:3] encoding:NSUTF8StringEncoding];
NSString    *noBOMString = [theResult stringByReplacingOccurrencesOfString:bomString withString:@" "];
但由于某些原因,它不起作用。有些XML在根元素之后具有此序列。在本例中,NSXMLParser成功解析xml。Safari会忽略这些角色。所以Xcode调试器。请帮忙

谢谢


纳瓦

我不确定这是否是问题所在。我有一个非常相似的经验,文件被编码为UTF-8,但xml头声明它是UTF-16

由于不匹配,我无法解析它,出现了与您相同的错误。但是,将xml头从UTF-16更改为UTF-8解决了我的问题


您可能遇到类似的问题

嗯,这可能不是去除BOM字节的最佳方法,但它确实有效。对于像我这样花了数小时试图让NSXMLParser吞下Bom的人: 假设您通过NSURLConnection获取数据并将其存储在NSMutableData*webData中

    const char bom[3] = {0xEF, 0xBB, 0xBF};

char *data = [webData mutableBytes];
char *cp = data, *pp;
long lessBom = 0;
do {
    cp = strstr((const char *)cp, (const char *)bom);
    if (cp) {
        pp = cp;
        cp += 3;
        memcpy(pp, cp, strlen(cp));
        lessBom += 3;
    }
} while (cp != NULL);

NSMutableData   *newData = [[NSMutableData alloc] initWithBytes:data length:webData.length - lessBom];
然后用newData创建解析器,它就可以工作了!我很乐意得到对这段代码的任何评论/改进

我试图用这些BOM表字节创建一个字符串,如下所示:

    const   UInt8 bom[3] = {0xEF, 0xBB, 0xBF};
NSString    *bomString = [[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)bom length:3] encoding:NSUTF8StringEncoding];
NSString    *noBOMString = [theResult stringByReplacingOccurrencesOfString:bomString withString:@" "];
const   UInt8 bom[3] = {0xEF, 0xBB, 0xBF};
NSString    *bomString = [[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)bom length:3] encoding:NSUTF8StringEncoding];
NSString    *noBOMString = [theResult stringByReplacingOccurrencesOfString:bomString withString:@" "];
但由于某些原因,它不起作用

确保在实例化noboString时使用了正确的编码。如果文档数据是UTF-8,请确保将字符串实例化为UTF-8。同样,如果数据是UTF-16,请确保将字符串实例化为UTF-16


如果您传递了错误的编码,要么字符串根本不会实例化,我假设这不是您的问题,要么某些字符会出错。BOM可能是其中之一:如果输入是UTF-8,您将其解释为MacRoman或ISOLatin1,它将作为三个单独的字符出现在字符串中。这三个单独的字符不会与BOM表中的单个字符进行比较。

标题上显示:。如果我将这个xml保存在一个文件中,并用BBEdit打开它,我会看到它没有BOM表的utf-8编码。然而,当我打开此文件时,我在Resourcerer中看到的是关闭标题“>”后的BOM序列。我的问题是我如何摆脱这个?我在BBEdit中看到,这里绝对不使用strstr。这是C字符串,以null结尾,最后一个字节是0。NSMutableData的内容不会以null结尾,除非您自己这样做,并且可以包含null字节,其中第一个strstr和其他C字符串函数将视为终止符。NSData和NSMutableData具有可以更安全地完成相同工作的方法;有关详细信息,请参阅他们的文档。谢谢,我考虑过了,不过最后我可以添加一个“\0”。是的,结果字符串是用NSUTF8StringEncoding实例化的,所以我认为将BOM检查为3字符字符串的方法是正确的。事实上,c代码是有效的。AFAIK对于不同的编码有不同的BOM序列。那你建议怎么检查呢?可以使用可可字符串吗?只有一个BOM:U+FEFF。它在不同的编码中显示为不同的字节序列,因为不同的编码将相同的字符编码为不同的字节。从UTF-8创建BOMString是一种方法,但是从哪个UTF创建它并不重要,因为只要您给出正确的代码单位,它在结果字符串中总是U+FEFF。你的代码应该工作得很好;您可以尝试在stringByReplacing之前和之后将结果转储到文件中…并使用十六进制编辑器(如hex Fiend)查看它。我这样做是为了清楚地看到两个字符序列0xEF、0xBB、0xBF。所以我不明白为什么stringbyreplacing发生了,string对我不起作用。我试图记录bomString,但这些字符可能是不可见的。你能举一个使用Cocoa代码的例子吗?TIA*额头砰的一声*我刚刚意识到为什么它不起作用,因为您传递的UTF-8数据是从UTF-8 BOM开始的!显然,Cocoa将剥离并在适当的情况下使用显示在输入数据开头的BOM表。BOM表后没有任何其他字符;因此,您正在用空格替换没有字符的字符串,并且在文档字符串中的任何位置都找不到字符。因此,您需要以不同的方式创建BOM表字符串。[NSString stringWithFormat:@%C,0xFEFF]有效。非常感谢,它确实有效!一开始我怎么会知道呢?有医生可以让我了解它吗?