iOS HTML Unicode到NSString?
我正在将Android应用程序移植到iOS上,遇到了一个小障碍。我正在从网页中提取HTML编码的数据,但有些数据是以Unicode显示的,以显示外来字符。。。因此,俄语字符(Лзззззззззз)将被解析为,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
“&&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实体进行编码,但不使用