質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Xcode 7

Xcode 7は、ソフトウェア開発のためのアップルの統合開発環境であるXcodeのバージョン。UIを作成するために用いるグラフィカルツールです。iOS9/OS X El Capitan/watchOS2に対応。Swift 2コンパイラーが搭載されています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

3回答

3863閲覧

Swift plist 全角、日本語文字化けについて

alb14laq

総合スコア27

Xcode 7

Xcode 7は、ソフトウェア開発のためのアップルの統合開発環境であるXcodeのバージョン。UIを作成するために用いるグラフィカルツールです。iOS9/OS X El Capitan/watchOS2に対応。Swift 2コンパイラーが搭載されています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

1クリップ

投稿2015/12/08 11:14

編集2015/12/08 18:15

plistにDictionaryを作り、
その中にStringで key,英単語 Type,string value,単語の意味

(例:key,Dog type,string value,犬)のように作成しています。

階層はRoot(Dictionary)-Word(Dictionary)-A(Dictionary)-And(String)

これを「Dog = 犬, And = 同じ, Answer = 答え......」 と一度に取り出せるようにしたいのですが、printすると「Dog = "\U534b\U99fj";, And = "\U534b\U99fj";, Answer ="\U534b\U99fj";」のように日本語の部分が文字化け?してしまいます。

コードは

let path = NSBundle.mainBundle().pathForResource("English", ofType: "plist")

let dictionary = NSDictionary(contentsOfFile: path!)

if let value = dictionary?.objectForKey("Word"){ print("\(value)") }

と書いています。Stringで取り出せていないのが原因だと思いますが、うまくできません。どなたかアドバイスお願いいたします。

plistの階層はこんな感じになっています。実際には多くの英単語が入ります

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

最初にガッチリ型指定してやって後はシンプルに。(型指定が長過ぎる‥)

swift

1let path = NSBundle.mainBundle().pathForResource("English", ofType: "plist") 2let dictionary: Dictionary<String, Dictionary<String, Dictionary<String, String>>> = NSDictionary(contentsOfFile: path!) as! Dictionary<String, Dictionary<String, Dictionary<String, String>>> 3 4for (_, letters) in dictionary { 5 for (letter, words) in letters { 6 print("[\(letter)]") 7 for (en, ja) in words { 8 print("\(en)=\(ja)") 9 } 10 } 11}

Englush.plist

[A] Answer=答え And=同じ [D] Dog=犬

投稿2015/12/09 01:57

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

alb14laq

2015/12/09 04:00

ありがとうございます!できるようになりました!
guest

0

再度修正しました。
こちらの環境はXcode7.1です。

齟齬が無い様にswiftコードとplist(XML)のコードを載せておきます。

これで以下の様に出力されました。
Answer = 答え
Dog = 犬
And = 同じ

swift

1import UIKit 2 3class ViewController: UIViewController { 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 8 let path = NSBundle.mainBundle().pathForResource("English", ofType: "plist") 9 let dictionary: NSDictionary = NSDictionary(contentsOfFile: path!)! 10 11 12 if let wordDict = dictionary["Word"] { 13 if let Adict = wordDict["A"] { 14 for (Eng, Jap) in Adict as! Dictionary<String, String> { 15 print("\(Eng)" + " = " + "\(Jap)") 16 } 17 } 18 } 19 } 20 21 override func didReceiveMemoryWarning() { 22 super.didReceiveMemoryWarning() 23 } 24} 25

xml

1<?xml version="1.0" encoding="UTF-8"?> 2<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 3<plist version="1.0"> 4<dict> 5 <key>Word</key> 6 <dict> 7 <key>A</key> 8 <dict> 9 <key>Dog</key> 10 <string></string> 11 <key>And</key> 12 <string>同じ</string> 13 <key>Answer</key> 14 <string>答え</string> 15 </dict> 16 </dict> 17</dict> 18</plist> 19

投稿2015/12/08 13:57

編集2015/12/08 20:33
_Kentarou

総合スコア8490

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

alb14laq

2015/12/08 14:15 編集

plistのやり方が違ったみたいです。 Root,Word,Aまでは同じですが、Keyやtype,valueは一番上の横並びになっているもののことです。うまく伝えられずすみませんでした。 Dog string  犬 という風に書いていて「Dog = 犬」と、取り出したいのですがplistではできないでしょうか? plistのスクショを上にのせました  
_Kentarou

2015/12/08 14:57

勘違いしていたので回答を修正しました。
alb14laq

2015/12/08 18:10

再びありがとうございます!やってみたのですが先ほどと同じように「Ambiguous use of 'subscript'」と出てしまいます。。。 あと、「Dog=犬」だけでなくその他の単語と意味(And=同じ、Answer=答え.............など)も同時に取り出したいのですが、そのようにすることはできませんか?
_Kentarou

2015/12/08 20:38

再度修正しました、こちらで試してみてください。
alb14laq

2015/12/09 03:59

何度も本当にありがとうございます!やはり同じエラーが起きてしまいました、、バージョンは7.1.1です。何か他のところに問題があるんでしょうか。上の方のを試してみたらできるようになりました!
guest

0

これで犬!です。

swift

1 2let path = NSBundle.mainBundle().pathForResource("English", ofType: "plist") 3 4let dictionary = NSDictionary(contentsOfFile: path!) 5 6if let value = dictionary?.objectForKey("Word") { 7 8 print("\(value["value"] as! String)") 9}

投稿2015/12/08 12:05

_Kentarou

総合スコア8490

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

alb14laq

2015/12/08 13:43

早速の回答ありがとうございます。教えていただいたコードを書いたのですが、一箇所エラーを吐いてしまいました。エラーは「Ambiguous use of 'subscript'」です。何が原因かわかりますでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問