電子書籍の厳選無料作品が豊富!

iOSアプリ開発しています。(iOS5 SDK/Xcode4.3/Objective-C)

XMLファイル(日本語を含む)を読み込みそれを表示さたいのですが文字化けしてしまい困っています。

今、私が試しているのは「iPhone/iPadアプリ開発逆引き大全500の極意」という書籍のサンプルの中の「XMLファイルを読み込む」というサンプルです。サンプルだとXMLファイルで読み込む文字列はアルファベットなのでちゃんとうごいて文字化けせずに表示もされます。ですが、xmlファイルの読み込みたい文字列を日本語にすると「ÅÏ∞‰æ」のような感じで文字化けしてしまいます。

このサンプルのxmlファイル読み込みにはxmlParseFile関数、libxml2を使用していて、XMLファイル(persons.xml)を読み込んでUITextViewに表示するプログラムです。

サンプルのxmlファイル内にある文字列「masuda tomoaki」「yamada taro」「tanaka ziro」をそれぞれ「松田」「山田」「田中」と書き換えて保存してアプリを実行すると文字化けします。
他にどこか書き換えないといけないのでしょうか?
↓サンプルコードを付けています。

どうしたら日本語も読み込めるようになるか、どなたかアドバイスをお願いします。ネットで何日もかけて調べても解決できなかったのでどうか助けてください。
何卒よろしくお願いします。

↓「iPhone/iPadアプリ開発逆引き大全500の極意」のサンプルダウンロードページ(この中のBasic195)
http://www.shuwasystem.co.jp/support/7980html/33 …

以下、サンプルのコード「ViewController.h」「ViewController.m」「persons.xml」です。

【ViewController.h】

#import <UIKit/UIKit.h>
#include <libxml/parser.h>
#include <libxml/xpath.h>

@interface ViewController : UIViewController
{
IBOutlet UITextView *textView;
}

- (IBAction)clickRead:(id)sender;

@end



【ViewController.m】

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}

- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}


- (IBAction)clickRead:(id)sender
{
NSString *path = [[NSBundle mainBundle] pathForResource:@"persons" ofType:@"xml"];
xmlDocPtr doc = xmlParseFile([path cStringUsingEncoding:NSUTF8StringEncoding]);
// XMLファイルを読み込む
xmlXPathContextPtr context = xmlXPathNewContext(doc);
xmlChar *xpath = (xmlChar*)[@"//person/name" cStringUsingEncoding:NSUTF8StringEncoding];
xmlXPathObjectPtr result = xmlXPathEval(xpath , context);

xmlNodeSetPtr nodeset = result->nodesetval;
NSMutableString *text = [NSMutableString string];
for ( int i=0; i<nodeset->nodeNr; i++ ) {
xmlChar *element = xmlNodeListGetString(doc, nodeset->nodeTab[i]->children, 1);
NSLog(@"element: %s", element);
[text appendFormat:@"name: %s\n", element];
}
xmlXPathFreeObject(result);
xmlXPathFreeContext(context);

textView.text = text;
}

@end


【persons.xml】

<?xml version="1.0" encoding="utf-8" ?>
<persons>
<person id="01">
<name>masuda tomoaki</name>
<age>43</age>
<address>tokyo</address>
</person>
<person id="02">
<name>yamada taro</name>
<age>30</age>
<address>oosaka</address>
</person>
<person id="03">
<name>tanaka ziro</name>
<age>20</age>
<address>hokkaido</address>
</person>
</persons>

A 回答 (2件)

ViewController.mの、clickReadを以下のように書き換えてみてください。



- (IBAction)clickRead:(id)sender
{
NSString *path = [[NSBundle mainBundle] pathForResource:@"persons" ofType:@"xml"];
xmlDocPtr doc = xmlParseFile([path cStringUsingEncoding:NSUTF8StringEncoding]);
// XMLファイルを読み込む
xmlXPathContextPtr context = xmlXPathNewContext(doc);
xmlChar *xpath = (xmlChar*)[@"//person/name" cStringUsingEncoding:NSUTF8StringEncoding];
xmlXPathObjectPtr result = xmlXPathEval(xpath , context);

xmlNodeSetPtr nodeset = result->nodesetval;
NSMutableString *text = [NSMutableString string];
for ( int i=0; i<nodeset->nodeNr; i++ ) {
xmlChar *element = xmlNodeListGetString(doc, nodeset->nodeTab[i]->children, 1);
NSString* str = [NSString stringWithCString:element encoding:NSUTF8StringEncoding];
NSLog(@"str=%@",str); // << ここと
[text appendFormat:@"name: %@\n", str]; // << ここ
// NSLog(@"element: %s", element);
// [text appendFormat:@"name: %s\n", element];
}
xmlXPathFreeObject(result);
xmlXPathFreeContext(context);

textView.text = text;
}

Readボタンを押して、nameに漢字が設定されても、正しく表示されると思います。
「【アプリ開発】日本語を含むXMLファイル」の回答画像2
    • good
    • 0
この回答へのお礼

できました!!
NSString* str = [NSString stringWithCString:element encoding:NSUTF8StringEncoding];
のところで警告が出てきましたが、
NSString* str = [NSString stringWithCString:(const char*)element encoding:NSUTF8StringEncoding];
に訂正すると警告も無く動作して日本語も表示されました。

本当にありがとうございました。
大変感謝しておりますm(__)m

お礼日時:2012/11/05 12:19

書き換えた【persons.xml】ファイルを、encoding="utf-8"で保存していますか?

この回答への補足

encoding="utf-8"で保存はしているかどうかはわかりません....
Xcode上で開いて修正して保存しているだけなので....
何か別のアプリケーションで開いてちゃんとencoding="utf-8"保存しないといけないのでしょうか?

試しにmacのテキストエディタで開いて修正して保存してもダメでした。
テキストエディタの環境設定でエンコーディングは「Unicode(UFT-8)」になっていました。

たぶん、encoding="utf-8"で保存されているとは思うんですが....

補足日時:2012/07/21 20:46
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!