0

éñのような文字でXMLを解析しようとしています。エンコーディングとしてUTF8を使用しています。

エンコードをNSISOLatin1StringEncodingに変更しようとしましたが、機能しません

コードは次のとおりです。

   -(void)connectionDidFinishLoading:(NSURLConnection *)connection
 {
//NSLog(@"DONE. Received Bytes: %d", [webData length]);
NSString *theXML = [[NSString alloc] initWithBytes: [webData mutableBytes] length:[webData length] encoding:NSUTF8StringEncoding];
//  NSLog(theXML);
[theXML release];
if( xmlParser )
{
    [xmlParser release];
}
xmlParser = [[NSXMLParser alloc] initWithData: webData];
[xmlParser setDelegate:self];
[xmlParser setShouldResolveExternalEntities:YES];
[xmlParser parse];
if (connection) {
    [connection release];
    }
  }


 -(void)callWS {
  NSString *url = @"theUrlHere";
  NSMutableURLRequest *request =[[[NSMutableURLRequest alloc] init] autorelease];
[request setURL:[NSURL URLWithString:url]];
[request setHTTPMethod:@"GET"];

NSURLConnection *conn=[[NSURLConnection alloc] initWithRequest:request delegate:self];
   if (conn) {
      webData = [[NSMutableData data] retain];
   }

xml応答を受信すると...特殊文字を含む結果が間違って表示されます...

    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
  {
   if(!soapResults)
{
 ....//the soapResults here appears wrong when It has special chars...

  }

例:CaperuçúçúIndianópolisはópolisに表示されます

4

1 に答える 1

3

parser:foundCharacters:デリゲートメソッドのドキュメントを参照してください。

パーサーオブジェクトは、要素の文字を報告するために、デリゲートにいくつかのparser:foundCharacters:メッセージを送信する場合があります。文字列は現在の要素の合計文字コンテンツの一部にすぎない可能性があるため、要素が変更されるまで、文字列を現在の文字の累積に追加する必要があります。

あなたのコードは文字を蓄積せず、最後の parser:foundCharacters:呼び出しの結果を使用していると思います。

次のサンプルプログラムは、入力文字列でこの効果を示しています。

-(void)parse
{
    NSString *xmlString = @"<a><b>Indianópolis</b><c>Caperuçú</c></a>";
    NSData *xmlData = [xmlString dataUsingEncoding:NSUTF8StringEncoding];

    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:xmlData];
    parser.delegate = self;
    [parser parse];
}

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict
{
    NSLog(@"didStartElement: %@", elementName);
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
    NSLog(@"didEndElement: %@", elementName);
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
{
    NSLog(@"foundCharacters: %@", string);
}

出力:

didStartElement: a
didStartElement: b
foundCharacters: Indian
foundCharacters: ópolis
didEndElement: b
didStartElement: c
foundCharacters: Caperu
foundCharacters: çú
didEndElement: c
didEndElement: a

したがって、これはエンコーディングの問題ではありません。

于 2013-01-07T18:17:08.967 に答える