我正在尝试转换一些特殊字符,例如 ä
, ö
, ü
, α
, μ
, α
, ο
, ι
,以及网页上的其他内容。当我使用 ASIHTTPRequest 下载页面时,我得到一些代码而不是字符本身。示例:
ä = \u00E4
μ = \u03BC
α = \u03B1
如果我使用 [NSString stringWithContentsOfURL:aNSURL encoding:NSASCIIStringEncoding error:nil];
也会发生这种情况
我尝试了不同的可用编码,但它们都不适用于上面的示例。例如:使用 NSUnicodeStringEncoding
我得到一些奇怪的像“中文”字符和 NSASCIIStringEncoding
我得到这些数字和字母。
奇怪的是,如果我在像 safari 这样的网络浏览器中查看网页的源代码,一切都很好,正常的 HTML 字符实体如:ä = ä
有什么办法可以将这些编码字母转换回来吗?
谢谢
编辑
抱歉,我忘了提到上面浏览器的源代码。
我刚刚注意到这个网站:link十六进制 HTML 实体与我使用此代码得到的非常相似。示例:
ä = ä
μ = μ
α = α
正如您所看到的,它们非常相似。只是小写和 0
被替换为 x
,并在开头添加 &#
,到最后;
。
我只需要编写一些小代码来将数字和字母转换为十六进制实体,这不会是一个大问题。然后只需使用 HTML 实体转换器即可完成。
无论如何,非常感谢您再次帮助我
肖恩
最佳答案
您可以使用在此处找到的link 。它使用 CFXML 解析器的内置方法。它描述了下面的代码
@interface MREntitiesConverter : NSObject {
NSMutableString* resultString;
}
@property (nonatomic, retain) NSMutableString* resultString;
- (NSString)convertEntiesInString:(NSString)s;
@end
@implementation MREntitiesConverter
@synthesize resultString;
- (id)init
{
if([super init]) {
resultString = [[NSMutableString alloc] init];
}
return self;
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)s {
[self.resultString appendString:s];
}
- (NSString)convertEntiesInString:(NSString)s {
if(s == nil) {
NSLog(@"ERROR : Parameter string is nil");
}
NSString* xmlStr = [NSString stringWithFormat:@"<d>%@</d>", s];
NSData *data = [xmlStr dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];
NSXMLParser* xmlParse = [[NSXMLParser alloc] initWithData:data];
[xmlParse setDelegate:self];
[xmlParse parse];
NSString* returnStr = [[NSString alloc] initWithFormat:@"%@",resultString];
return returnStr;
}
- (void)dealloc {
[resultString release];
[super dealloc];
}
@end
或者,您可以使用 NSString* sI = (NSString*)CFXMLCreateStringByUnescapingEntities(NULL, (CFStringRef)s, NULL);
,该方法的可用性取决于您要构建的操作系统。
关于objective-c - NSString 特殊字符编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8114162/