みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

【アプリ開発】日本語を含むXMLファイル読み込み

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/3352.html

以下、サンプルのコード「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>

投稿日時 - 2012-07-20 19:21:13

QNo.7601250

すぐに回答ほしいです

質問者が選んだベストアンサー

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に漢字が設定されても、正しく表示されると思います。

投稿日時 - 2012-11-03 07:04:27

お礼

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

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

投稿日時 - 2012-11-05 12:19:59

ANo.2

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

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

投稿日時 - 2012-07-21 11:31:05

補足

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

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

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

投稿日時 - 2012-07-21 20:46:06

あなたにオススメの質問