xcode。将HTML代码中包含字符的字符串转换为Unicode字符串
这是我的问题。iPhone上的程序应该和服务器同步,服务器也和服务的web版本同步。Web服务以HTML代码(amp;,quote;)向服务器发送字符串中的特殊字符;,№ 等等)。我需要显示这些数据,这就是为什么我需要将这些符号转换成xcode可以解码和绘制的东西。 正如我发现的,HTML中以Unicode结尾的代码是相同的,不同之处只是格式不同(如№ 在HTML中是\u8470(在Unicode中)。我试着用字符串改变这种格式,并将其编码为UTF8。因此,现在我有了一个函数:xcode。将HTML代码中包含字符的字符串转换为Unicode字符串,html,xcode,unicode,encoding,Html,Xcode,Unicode,Encoding,这是我的问题。iPhone上的程序应该和服务器同步,服务器也和服务的web版本同步。Web服务以HTML代码(amp;,quote;)向服务器发送字符串中的特殊字符;,№ 等等)。我需要显示这些数据,这就是为什么我需要将这些符号转换成xcode可以解码和绘制的东西。 正如我发现的,HTML中以Unicode结尾的代码是相同的,不同之处只是格式不同(如№ 在HTML中是\u8470(在Unicode中)。我试着用字符串改变这种格式,并将其编码为UTF8。因此,现在我有了一个函数: +(NS
+(NSString *) replaceHTMLCodes:(NSString *)text{
NSLog(@"replacing HTML codes");
if (text){
NSLog(@"%@", text);
NSString *tmpString=[NSString stringWithString:text];
tmpString = [text copy];
NSString *tmpText = @"";
int locAmp = [tmpString rangeOfString:@"&#"].location;
NSString * Code = @"";
int locComa;
while (locAmp!=NSNotFound) {
tmpText = [tmpText stringByAppendingString:[tmpString substringToIndex:locAmp]];
tmpString = [tmpString stringByReplacingCharactersInRange:NSMakeRange(0, locAmp) withString:@""];
locComa = [tmpString rangeOfString:@";"].location;
Code = [NSString stringWithString:[tmpString substringWithRange:NSMakeRange(0, locComa)]];
Code = [Code stringByReplacingOccurrencesOfString:@"&#" withString:@"\\u"];
NSLog(@"%@", Code);
tmpString = [tmpString stringByReplacingCharactersInRange:NSMakeRange(0, locComa+1) withString:@""];
tmpText = [tmpText stringByAppendingFormat:@"%C", Code];
locAmp = [tmpString rangeOfString:@"&#"].location;
}
tmpText = [tmpText stringByAppendingString:tmpString];
NSLog(@"%@", tmpText);
return tmpText;
}
else
return text;
}
但它工作不正常-它显示随机的Unicode符号,而不是我想要的。我曾尝试使用NSUTF8StringEncoding,但也没用
有什么办法解决这个问题吗?转换代码对吗?在您的例程中有一两个小错误。这个版本似乎有效
NSString * replaceHTMLCodes(NSString *text)
{
if (text){
NSString *tmpString=[NSString stringWithString:text];
tmpString = [text copy];
NSString *tmpText = @"";
int locAmp = [tmpString rangeOfString:@"&#"].location;
NSString * Code = @"";
int locComa;
while (locAmp!=NSNotFound && locAmp != -1) {
tmpText = [tmpText stringByAppendingString:[tmpString substringToIndex:locAmp]];
tmpString = [tmpString stringByReplacingCharactersInRange:NSMakeRange(0, locAmp) withString:@""];
locComa = [tmpString rangeOfString:@";"].location;
Code = [NSString stringWithString:[tmpString substringWithRange:NSMakeRange(0, locComa)]];
Code = [Code stringByReplacingOccurrencesOfString:@"&#" withString:@""];
tmpString = [tmpString stringByReplacingCharactersInRange:NSMakeRange(0, locComa+1) withString:@""];
tmpText = [tmpText stringByAppendingFormat:@"%C", [Code intValue]];
locAmp = [tmpString rangeOfString:@"&#"].location;
}
tmpText = [tmpText stringByAppendingString:tmpString];
return tmpText;
}
else
return text;
}
谢谢你,戴夫。你的回答很有用。最后,这是我的例行程序。希望,这对某人有用
+(NSString *) replaceHTMLCodes:(NSString *)text{
if (text){
NSString *tmpString=[NSString stringWithString:text];
tmpString = [text copy];
NSString *tmpText = @"";
int locAmp = [tmpString rangeOfString:@"&"].location;
NSString * Code = @"";
int locComa;
while (locAmp!=NSNotFound && locAmp!=-1) {
tmpText = [tmpText stringByAppendingString:[tmpString substringToIndex:locAmp]];
tmpString = [tmpString stringByReplacingCharactersInRange:NSMakeRange(0, locAmp) withString:@""];
locComa = [tmpString rangeOfString:@";"].location;
Code = [NSString stringWithString:[tmpString substringWithRange:NSMakeRange(0, locComa)]];
Code = [Code stringByReplacingOccurrencesOfString:@"&" withString:@""];
if ([Code characterAtIndex:0]=='#') {
Code = [Code stringByReplacingOccurrencesOfString:@"#" withString:@""];
tmpText = [tmpText stringByAppendingFormat:@"%C", [Code intValue]];
} else {
if ([Code compare:@"amp"]==NSOrderedSame) {
tmpText = [tmpText stringByAppendingString:@"&"];
} else if ([Code compare:@"quot"]==NSOrderedSame) {
tmpText = [tmpText stringByAppendingString:@"\""];
} else if ([Code compare:@"gt"]==NSOrderedSame) {
tmpText = [tmpText stringByAppendingString:@">"];
} else if ([Code compare:@"lt"]==NSOrderedSame) {
tmpText = [tmpText stringByAppendingString:@"<"];
} else if ([Code compare:@"laquo"]==NSOrderedSame) {
tmpText = [tmpText stringByAppendingString:@"«"];
} else if ([Code compare:@"raquo"]==NSOrderedSame) {
tmpText = [tmpText stringByAppendingString:@"»"];
}
}
tmpString = [tmpString stringByReplacingCharactersInRange:NSMakeRange(0, locComa+1) withString:@""];
locAmp = [tmpString rangeOfString:@"&"].location;
}
tmpText = [tmpText stringByAppendingString:tmpString];
return tmpText;
}
else
return text;
}
+(NSString*)替换HtmlCodes:(NSString*)文本{
如果(文本){
NSString*tmpString=[NSString stringWithString:text];
tmpString=[文本副本];
NSString*tmpText=@;
int locAmp=[tmpString rangeOfString:@“&]”。位置;
NSString*代码=@;
内洛科马;
while(locAmp!=NSNotFound&&locAmp!=-1){
tmpText=[tmpText stringByAppendingString:[tmpString substringToIndex:locAmp]];
tmpString=[tmpString stringByReplacingCharactersInRange:NSMakeRange(0,locAmp)with string:@'';
locComa=[tmpString rangeOfString:@”;“].位置;
代码=[NSString stringWithString:[tmpString substringWithRange:NSMakeRange(0,locComa)];
Code=[Code stringByReplacingOccurrencesOfString:@”和“with string:@”“”;
如果([Code characterAtIndex:0]=='#'){
代码=[Code stringByReplacingOccurrencesOfString:@“#”with string:@”“];
tmpText=[tmpText stringByAppendingFormat:@“%C”,[Code intValue]];
}否则{
如果([代码比较:@“amp”]==传感器名称){
tmpText=[tmpText stringByAppendingString:@“&”];
}else if([代码比较:@“quot”]==传感器名称){
tmpText=[tmpText stringByAppendingString:@“\”;
}else if([代码比较:@“gt”]==SensorDeredName){
tmpText=[tmpText stringByAppendingString:@“>”;
}else if([代码比较:@“lt”]==传感器名称){
tmpText=[tmpText stringByAppendingString:@“这是我的版本。可以找到可用代码的列表
我为NSString创建了类别:
@interface NSString (HTMLDecode)
- (NSString *)htmlfDecodedString;
@end
@implementation NSString (HTMLDecode)
- (NSString *)htmlfDecodedString{
NSDictionary *codesToSymbols = @{@""" : @"\"",
@"&" : @"&",
@"<" : @"<",
@">" : @">",
@"€" : @"€",
@"«" : @"«",
@"»" : @"»"};
NSMutableString *str = [self mutableCopy];
[codesToSymbols enumerateKeysAndObjectsUsingBlock:^(NSString *key, NSString *value, BOOL *stop) {
[str replaceOccurrencesOfString:key withString:value options:NSCaseInsensitiveSearch range:NSMakeRange(0, str.length)];
}];
return str;
}
@end
@接口NSString(HTMLDecode)
-(NSString*)htmlfDecodedString;
@结束
@实现NSString(HTMLDecode)
-(NSString*)HTMLFDecatedString{
NSDictionary*codesToSymbols=@{@'':@“\”,
@“&;”:@“&”,
@"" : @"",
@“&euro;”:@“€”,
@“«;:@”«”,
@“»;”:@“»”};
NSMutableString*str=[self-mutableCopy];
[codesToSymbols enumerateKeysAndObjectsUsingBlock:^(NSString*键,NSString*值,布尔*停止){
[str REPLACEOCURNCESOFSTRING:key withString:value选项:NSCaseInsensitiveSearch范围:NSMakeRange(0,str.length)];
}];
返回str;
}
@结束
如何使用它
就这么简单:
NSString *html =
@"<table>\
<tbody>\
<tr>\
<td>Testing html symbols. Ampersand:&. «Hello Double». ‘Hello single!‘\
</td>\
</tr>\
</tbody>\
</table>";
NSString *result = [html htmlfDecodedString];
NSLog(@"converted html:\n%@",result);
NSString*html=
@"\
\
\
测试html符号。与符号:“Hello Double”和“Hello single!”\
\
\
\
";
NSString*结果=[html htmlfDecodedString];
NSLog(@“转换的html:\n%@”,结果);
它将生成如下html:
<table><tbody><tr><td>Testing html symbols. Ampersand:&. «Hello Double». 'Hello single!'</td></tr></tbody></table>
测试html符号。符号:&.«Hello Double»。“Hello single!”
一大早就要消化这一点有点难,但原则上我会说通过HTML解析器运行数据,您可以将其设置为输出UTF-8编码的文本。谢谢您的帮助!看来,我需要更仔细地学习手册!它确实有效。