【アプリ開発】XMLファイル読み込みで日本語表示が文字化けしてしまう問題について

このQ&Aのポイント
  • iOSアプリ開発中にXMLファイルを読み込んで日本語を表示したいですが、文字化けしてしまいます。
  • 「iPhone/iPadアプリ開発逆引き大全500の極意」のサンプルを使用していますが、日本語文字列が正しく表示されません。
  • 解決方法を探していますが、ネットでの情報では解決できない状況です。どなたかアドバイスをお願いします。
回答を見る
  • ベストアンサー

【アプリ開発】日本語を含む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>

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

  • ベストアンサー
  • zeds
  • ベストアンサー率100% (1/1)
回答No.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に漢字が設定されても、正しく表示されると思います。

niioroo
質問者

お礼

できました!! NSString* str = [NSString stringWithCString:element encoding:NSUTF8StringEncoding]; のところで警告が出てきましたが、 NSString* str = [NSString stringWithCString:(const char*)element encoding:NSUTF8StringEncoding]; に訂正すると警告も無く動作して日本語も表示されました。 本当にありがとうございました。 大変感謝しておりますm(__)m

その他の回答 (1)

  • jppy
  • ベストアンサー率14% (14/99)
回答No.1

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

niioroo
質問者

補足

encoding="utf-8"で保存はしているかどうかはわかりません.... Xcode上で開いて修正して保存しているだけなので.... 何か別のアプリケーションで開いてちゃんとencoding="utf-8"保存しないといけないのでしょうか? 試しにmacのテキストエディタで開いて修正して保存してもダメでした。 テキストエディタの環境設定でエンコーディングは「Unicode(UFT-8)」になっていました。 たぶん、encoding="utf-8"で保存されているとは思うんですが....

関連するQ&A

  • c++でxpath指定でXML

    c++でプログラミングを学んでいます。 XMLを使って設定ファイルを作ろうと思っています。 プログラム側で、あらかじめどのようなフォーマットのXMLかは知っているので、 ルートからのxpathを文字列で指定して要素を読みに行きたいのですが、 どのライブラリがこれを出来るのかわからない(1)、 また、サンプルが見付からない(2)、 ので困っています。 (1)と(2)について教えてください。★ (1)については、XercesとXalanとlibxml2が出来そう?、 (2)については直接指定のサンプルを全くみつけられていない、というところです。 (ソースコードについてくるサンプルでも直接指定は見つけられていなくて、複雑だと読めなくて困ってます。) (出来そうだという書き込みは、日本語圏・英語圏でちらほら見られる。) 因みに、boost::property_treeで読もうと思ったりしましたが、属性を検索キーにする必要があって、xpathが利用できないと複雑なプログラムを書かないとならないので、やめました。 そこまでするならXMLのフォーマットを変えよう→XMLの意味が無い→何としてもxpath、と…。 よろしくお願いします。

  • PerlによるXMLファイルの解析&出力

    XMLファイルで以下のようなXMLファイルから、 <?xml version="1.0" encoding="Shift_JIS"?> <class3> <Personal> <No>1</No> <Name>相上男</Name> <phone>00-0000</phone> </Personal> <Personal> <No>2</No> <Name>柿句毛子</Name> <phone>11-1111</phone> </Personal> </class3> perlでNameの部分のタグだけ抜き出しXMLファイルに出力するプログラムを組み立てたいです。自分でも以下のようなプログラムを組み立てたのですが、 #!/usr/bin/perl use strict; use Encode; use XML::XPath; use XML::XPath::XMLParser; # 書き込み用にファイルを開く open( OUTPUTFILE, ">Output2.xml" ); # 標準出力に書き出し print &xml_xpath; # ファイルを出力先に設定 select( OUTPUTFILE ); # 出力先を元に戻す select( STDOUT ); # ファイルを閉じる close( OUTPUTFILE ); sub xml_xpath{ my $file = "class3.xml"; my $xp = XML::XPath->new(filename => $file); foreach my $node( $xp->find('/class3/Personal/Name')->get_nodelist){ print Encode::encode("shift_jis", $node )."\n"; } } XML::XPath::Node::Element=REF(0x1036c58c) XML::XPath::Node::Element=REF(0x1036cb8c) と、出てくるだけで動きません。ほとんど初心者なのでまったく見当違いのプログラムを組み立てているかもしれませんが、よろしくおねがいします。

  • XML::LibXMLのfindnodes()で、ワイルドカードを使いたい

    XML::LibXMLでXPathを使いたいのですが、 ワイルドカードの指定がうまくいきません。 要素名に*を当てはめたいのですが、、、、 例えば以下の通りです。 下記XMLのid="1-1"とid="1-2"を抜きだしたいのです。 できればXPathにて指定したいのですが、、、 教えてください。 my $dom = $parser->parse_file($xml_file_str) or die; $x = "//Test/TestText[@id="1-*"]/text()"; $c = $dom->findnodes($x); 解析対象XML <XML> <Test> <TestText id="1-1">テスト1</TestText> <TestText id="1-2">テスト2</TestText> <TestText id="2-1">テスト3</TestText> </Test> </XML>

    • ベストアンサー
    • Perl
  • 【Android2.1】XMLファイルの修正

    こんにちは、Androidアプリ開発において、XMLファイルの属性の修正、削除方法について、ご質問させて下さい。 Android2.1環境の元、XMLファイルで保存された情報を画面の指示に従って、修正、削除する処理を行いたいのですが、どのように実装すれば良いかわかりません。 ※XMLファイル自体の扱い経験がなく、困っております。 いろいろ調べているうちに「javax.xml.transform」クラスのメソッドを使用してXMLの更新を行っていたりしていたのですが、Android2.1では使用できない模様です。 分かりずらい文章になり、誠に申し訳ありませんが、 なにか良い情報、サイトをご存じの方がおられましたら、お教え下さい。 よろしくお願いします。 ------------------------------------- <user> <name>あああ</name> ←「かかか」に変更したい! <age>20</age> </user> <user> ←このuserノード自体を削除したい! <name>いいい</name> <age>25</age> </user> <user> <name>ううう</name> <age>30</age> </user>

    • ベストアンサー
    • Java
  • XML::XPathを使う

    エラーがでて期待する出力が出ず困っています。 ファイル名とXPathのコマンドライン引数をとり、 指定されたパスに一致するノードを出力するものです。 (参考書の写しなので、記述ミスはないと思います。) ■grabber.pl use XML::XPath; use XML::XPath::XMLParser; my $xpath = XML::XPath->new( filename => shift @ARGV ); my $nodeset = $xpath->find( shift @ARGV ); foreach my $node ( nodeset->get_nodelist ) { print XML::XPath::XMLParser::as_string( $node ) . "\n"; } コマンドラインに入力しているものは、 perl grabber.pl data.xml "/inventory/category/item/name" ■data.xml <?xml version="1.0"?> <inventory date="2001"> <category> <item id="2"> <name>aaaa</name> </item> </category> </inventory> です。 perl grabber.pl data.xml "/inventory/category/item/name" としても、下記にエラーが出ます。 Can't locate object method "get_nodelist" via package "nodeset" (perhaps you for got to load "nodeset"?) at grabber.pl line 5. いろいろ試してみたり調べたのですが、 行き詰ってしまいました。 期待する出力は"<name>aaaa</name>"なのですが・・・ どなたかこのエラーの原因がおわかりになるかた いらっしゃいますでしょうか。 環境は以下になります。 ・windowsxp ・activePerl モジュールのインストール済み ・XML-XPath ・XML-Parser 以上です。

    • ベストアンサー
    • Perl
  • XMLのキーと値を取得するには?

    PerlでXMLの処理をしたいのですが、以下のようなXMLをどのようにしたら値が取れるのでしょうか? できれば、Person->Name{'A'}->Seiseki->Englishで50が取得できるような 直感的な方法がうれしいです。 <Person> <Name>A</Name> <Age>29</Age> <Sex>M</Sex> <Seiseki> <English>50</English> <Math>60</Math> <Gymnastic>10</Gymnastic> </Seiseki> <Name>B</Name> <Age>32</Age> <Sex>F</Sex> <Seiseki> <English>60</English> <Math>40</Math> <Gymnastic>50</Gymnastic> </Seiseki> </Person>

    • ベストアンサー
    • Perl
  • 配列の中を変更

    入力したnameに、入力したageの数だけ文字を進める(例えばnameがOda、ageが12→表示結果がAmp)にする関数を作成しようとしたのですが、やり方がまったくわかりません。 そもそもこのような場合、文字1つ1つに別の配列を使わなければならないのでしょうか? #include <stdio.h> #define N 1 #define NAME 20 typedef struct{ char name[NAME]; char age; } person; int main(void){ int i; person persons[N]; for(i=0;i<N;i++){ printf("name > "); scanf("%s" , persons[i].name); printf("age > "); scanf("%d" , &persons[i].age); } for(i=0;i<N;i++){ printf("name = %s\n" , persons[i].name); printf("age = %d\n" , persons[i].age); } return 0; }

  • xmlを読み込んで、データをリストに・・・

    Javaでxmlファイルを読み込んで、リストに入れたいのです。xmlファイルには <info id="hogehoge" name="sample" </info> <info id="hogehogehoge" name="samplesample" </info> といったようにrootがないxmlファイルになっており、idをリストに入れたいのです。rootタグがないと難しいでしょうか? どなたかご教授願います!

    • ベストアンサー
    • Java
  • xml中の円記号について

    libxml2で <?xml version="1.0" encoding="shift_jis"?> <project>   <path>C:\</path> <project> というXMLファイルをパースしたところ、 project/pathのcontentが文字化けしてしまいます。 バイトコードとしては 0x43 0x3a 0xc2 0xa5 という感じで円記号が悪さをしているようです。 なぜ文字化けするのか、 また回避する手段を教えてください。

    • ベストアンサー
    • XML
  • VB.netでXMLファイルの妥当性チェック

    下記のようなXMLファイルを読み込み、 スキーマファイルで妥当性の検証を行っているのですが、 'http://www.w3.org/2001/XMLSchemainstance:schemaLocation' 属性が宣言されていません。 というエラーになってしまいます。 schemaLocationはxsdにも宣言しないとまずいのでしょうか?どなたかご存知のかた教えてください。 ------------------------------------------------ <?xml version="1.0" encoding="UTF-8"?> <rfd:rdmxmlns:xsi="http://www.w3.org/2001/XMLSchemainstance" xmlns:rfd="file://XML\Samples\TEST" xsi:schemaLocation="file://XML\Samples\TEST C:\XML\Samples\Person.xsd"> <Person> <Date>2003-12-03T13:20:00+08:00</Date> <Name>H.HIGASHINO</Name> </Person> </rfd:rdm> -------------------------------------------------

専門家に質問してみよう