Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/101.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
iOS HTML Unicode到NSString?_Html_Ios_Unicode - Fatal编程技术网

iOS HTML Unicode到NSString?

iOS HTML Unicode到NSString?,html,ios,unicode,Html,Ios,Unicode,我正在将Android应用程序移植到iOS上,遇到了一个小障碍。我正在从网页中提取HTML编码的数据,但有些数据是以Unicode显示的,以显示外来字符。。。因此,俄语字符(Лзззззззззз)将被解析为,“&&1051;&1077;&1090;…” 在android中,我可以通过调用HTML.fromHTML()来解决这个问题。iOS中是否有类似的功能?如果您从网站获取数据,您将有一个NS(可变)数据对象作为您的接收缓冲区。您只需通过: NSString*myString=[[NSStri

我正在将Android应用程序移植到iOS上,遇到了一个小障碍。我正在从网页中提取HTML编码的数据,但有些数据是以Unicode显示的,以显示外来字符。。。因此,俄语字符(Лзззззззззз)将被解析为,
“&&1051;&1077;&1090;…”


在android中,我可以通过调用HTML.fromHTML()来解决这个问题。iOS中是否有类似的功能?

如果您从网站获取数据,您将有一个
NS(可变)数据对象作为您的接收缓冲区。您只需通过:
NSString*myString=[[NSString alloc]initWithData:myRecvData usingEncoding:nsonicodestingencoding]

如果您的服务器正在发送Unicode。如果您的服务器正在发送utf-8或其他,那么您还必须调整接收代码中的stringencoding

编辑:
看看这个

编写自己的HTML实体解码器非常容易。只需扫描字符串以查找&,读取以下内容;,然后解释结果。如果是“amp”、“lt”、“gt”或“quot”,请用相关字符替换。如果它以#开头,则它是一个数字实体。如果#后面跟一个“x”,则将其余部分视为十六进制,否则视为十进制。读取数字,然后将字符插入字符串中(如果您正在写入
NSMutableString
,您可以使用
[str appendFormat:@“%C”,thechar]
NSScanner
可以使字符串扫描非常容易,特别是因为它已经知道如何读取十六进制数字

我刚刚创建了一个函数,该函数可以为您执行此操作。请注意,我还没有实际测试过它,所以您应该按其速度运行它:

- (NSString *)stringByDecodingHTMLEntitiesInString:(NSString *)input {
    NSMutableString *results = [NSMutableString string];
    NSScanner *scanner = [NSScanner scannerWithString:input];
    [scanner setCharactersToBeSkipped:nil];
    while (![scanner isAtEnd]) {
        NSString *temp;
        if ([scanner scanUpToString:@"&" intoString:&temp]) {
            [results appendString:temp];
        }
        if ([scanner scanString:@"&" intoString:NULL]) {
            BOOL valid = YES;
            unsigned c = 0;
            NSUInteger savedLocation = [scanner scanLocation];
            if ([scanner scanString:@"#" intoString:NULL]) {
                // it's a numeric entity
                if ([scanner scanString:@"x" intoString:NULL]) {
                    // hexadecimal
                    unsigned int value;
                    if ([scanner scanHexInt:&value]) {
                        c = value;
                    } else {
                        valid = NO;
                    }
                } else {
                    // decimal
                    int value;
                    if ([scanner scanInt:&value] && value >= 0) {
                        c = value;
                    } else {
                        valid = NO;
                    }
                }
                if (![scanner scanString:@";" intoString:NULL]) {
                    // not ;-terminated, bail out and emit the whole entity
                    valid = NO;
                }
            } else {
                if (![scanner scanUpToString:@";" intoString:&temp]) {
                    // &; is not a valid entity
                    valid = NO;
                } else if (![scanner scanString:@";" intoString:NULL]) {
                    // there was no trailing ;
                    valid = NO;
                } else if ([temp isEqualToString:@"amp"]) {
                    c = '&';
                } else if ([temp isEqualToString:@"quot"]) {
                    c = '"';
                } else if ([temp isEqualToString:@"lt"]) {
                    c = '<';
                } else if ([temp isEqualToString:@"gt"]) {
                    c = '>';
                } else {
                    // unknown entity
                    valid = NO;
                }
            }
            if (!valid) {
                // we errored, just emit the whole thing raw
                [results appendString:[input substringWithRange:NSMakeRange(savedLocation, [scanner scanLocation]-savedLocation)]];
            } else {
                [results appendFormat:@"%C", c];
            }
        }
    }
    return results;
}
-(NSString*)stringByDecodingHTMLEntitiesInString:(NSString*)输入{
NSMutableString*结果=[NSMutableString];
NSScanner*扫描仪=[NSScanner scannerWithString:input];
[扫描仪设置字符stobeskiped:nil];
而(![scanner isattend]){
NSString*温度;
if([scanner scanuptString:@“&”intoString:&temp]){
[结果:字符串:temp];
}
if([scanner scanString:@“&”intoString:NULL]){
BOOL valid=YES;
无符号c=0;
NSU整数savedLocation=[扫描仪扫描位置];
if([scanner scanString:@“#”intoString:NULL]){
//它是一个数字实体
if([scanner scanString:@“x”intoString:NULL]){
//十六进制
无符号整数值;
if([scanner scanHexInt:&value]){
c=值;
}否则{
有效=否;
}
}否则{
//十进制
int值;
如果([scanner scanit:&value]&&value>=0){
c=值;
}否则{
有效=否;
}
}
if(![scanner scanString:@”;“intoString:NULL]){
//不;-终止、纾困并释放整个实体
有效=否;
}
}否则{
if(![scanner scanuptString:@”;“intoString:&temp]){
//&;不是有效的实体
有效=否;
}否则如果(![scanner scanString:@”;“intoString:NULL]){
//没有拖尾;
有效=否;
}else if([temp isEqualToString:@“amp”]){
c='&';
}else if([temp isEqualToString:@“quot]”){
c=“”;
}else if([temp isEqualToString:@“lt”]){
c='';
}否则{
//未知实体
有效=否;
}
}
如果(!有效){
//我们犯了错误,只是把所有东西都原封不动地散发出来
[结果appendString:[输入substringWithRange:NSMakeRange(保存位置,[扫描仪扫描位置]-保存位置)];
}否则{
[结果格式:@“%C”,C];
}
}
}
返回结果;
}
HTML(和XML)中的
&#(number);
结构称为字符引用。它不是Unicode特有的,只是HTML中的所有字符都是按照Unicode定义的,无论是逐字包含还是编码为字符或实体引用。(实体引用是命名的引用,看起来像
é;
&;
,如果您正在抓取HTML页面,您肯定也必须处理这些引用。)

标准库中没有用于解码字符或实体引用的函数。有关解码HTML文本内容的方法,请参阅。如果您只有字符引用和标准XML实体,如
&;
,则可以利用
NSXMLParser
解析
+yourstring+
,b但这不会处理特定于HTML的实体,如
é;


一般来说,屏幕抓取最好使用适当的HTML解析器,而不是字符串破解。这将把所有文本内容转换为文本节点,同时转换字符和实体引用。但是,同样,标准库中没有可用的HTML解析器。如果目标页是格式良好的独立XHTML,您可以再次n使用
NSXMLParser
。否则,您可能会想尝试libxml2,它提供了一个HTML解析器和XML。请参阅一些背景资料。

这里有什么问题?UTF-8现在非常常见。您没有详细说明您在使用什么进行HTML解析,或者您的问题是什么。啊,您更新了。我认为您指的是数据使用HTML实体进行编码,但不使用