NSXMLParser分割包含外来(unicode)字符的字符串 [英] NSXMLParser divides strings containing foreign(unicode) characters

查看:145
本文介绍了NSXMLParser分割包含外来(unicode)字符的字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我遇到了NSXMLParser的一个特殊问题.

I have ran into a peculiar problem with NSXMLParser.

由于某种原因,它会切掉所有挪威语字符æ,ø和å之前的所有字符.

For some reason it cuts out all the characters in front of all the norwegian characters æ, ø and å.

但是,所有非a-z字符(所有外来字符)的问题似乎都相同.

However, the problem seems to be the same with all non a-z characters.(All foreign characters)

示例:

现实:Mål 输出:ål

Reality: Mål Output: ål

现实:Le chant dessirènes 输出:ènes

Reality: Le chant des sirènes Output: ènes

这里有一个示例,我在日志中打印出了以下字符串:

Heres an example from the log where I have printed out the string from:

- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string

日志:

2012-02-22 14:00:01.647 VotePlayClient[2776:207] found characters: Le chant des sir
2012-02-22 14:00:01.647 VotePlayClient[2776:207] found characters: ènes

您可以清楚地看到,只要遇到外来字母,它就会跳到新行.

You can clearly see that it jumps to a new line whenever it encounters a foreign letter.

我相信我必须弄清楚如何将字符串或其他内容附加到该效果上.

I believe that I have to figure out how to append the string or something to that effect.

以下是NSXMLParser文件:

Here are the NSXMLParser files:

SearchXMLParser.h

SearchXMLParser.h

#import <Foundation/Foundation.h>
#import "Search.h"

@interface SearchXMLParser : NSObject <NSXMLParserDelegate>
{
NSMutableString *currentNodeContent;
NSMutableArray *searchhits;
NSMutableArray *trackhits;

NSXMLParser *parser;
Search *currentSearch;  
}

@property (readonly, retain) NSMutableArray *searchhits;
@property (readonly, retain) NSMutableArray *trackhits;

-(id) loadXMLByURL:(NSString *)urlString;

@end

SearchXMLParser.m

SearchXMLParser.m

#import "SearchXMLParser.h"
#import "Search.h"

@implementation SearchXMLParser

@synthesize searchhits, trackhits;

-(id) loadXMLByURL:(NSString *)urlString
{
    searchhits          = [[NSMutableArray alloc] init];
trackhits           = [[NSMutableArray alloc] init];
NSURL *url      = [NSURL URLWithString:urlString];
NSData  *data   = [[NSData alloc] initWithContentsOfURL:url];
parser          = [[NSXMLParser alloc] initWithData:data];
parser.delegate = self;
[parser parse];
return self;    
}

- (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
if ([elementname isEqualToString:@"track"]) 
{
    currentSearch = [Search alloc];
}

if ([elementname isEqualToString:@"track"]) 
{
    currentSearch.trackurl = [attributeDict objectForKey:@"href"];
}
}

- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{   
if ([elementname isEqualToString:@"name"]) 
{
    [trackhits addObject:currentNodeContent];

}

if ([elementname isEqualToString:@"track"]) 
{
    currentSearch.track = [trackhits objectAtIndex:0];
    currentSearch.artist = [trackhits objectAtIndex:1];
    currentSearch.album = [trackhits objectAtIndex:2];
    [trackhits removeAllObjects];

    [searchhits addObject:currentSearch];
    [currentSearch release];
    currentSearch = nil;
    [currentNodeContent release];
    currentNodeContent = nil;
}
}

- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
NSLog(@"found characters: %@", string);
currentNodeContent = (NSMutableString *) [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}

- (void) dealloc
{
[parser release];
[super dealloc];
}

@end

我已经检查了SO的答案,并找到了两个类似的帖子,但是没有任何一个可以为这个问题提供清晰的解决方案.

I have already checked SO for answers and found a couple of similar posts, but nothing that gave a clear solution to this problem.

有人可以阐明这个问题吗? :)非常感谢您的帮助!

Can anyone shed some light on this problem? :) Any help is much appreciated!

推荐答案

您的解析器:foundCharacters:方法无法正常工作.

your parser:foundCharacters: method does not work as it should.

这来自

解析器对象可以向委托发送多个parser:foundCharacters:消息,以报告元素的字符.因为字符串可能只是当前元素的全部字符内容的一部分,所以您应该将其附加到当前的字符累积中,直到元素改变为止.

您可以尝试以下操作(ARC):

you could try something like this (ARC):

- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    NSLog(@"found characters: %@", string);
    if (!currentNodeContent) {
        currentNodeContent = [[NSMutableString alloc] init];
    }
    [currentNodeContent appendString:string];
}

- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementname namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{   
    // your code here

    // when you are done with the string:
    currentNodeContent = nil;
}

这篇关于NSXMLParser分割包含外来(unicode)字符的字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆