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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Q&A

解決済

2回答

1947閲覧

SQLite3内の文字列がRubyで文字化けしてしまう

psycholodiver

総合スコア13

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

0グッド

1クリップ

投稿2019/01/11 03:37

前提・実現したいこと

SQLite3とRubyを使った、タスク管理ページを作っています。
SQLite3に登録したタスク内容を、ブラウザで表示したいのですが、文字化けしてしまいます。

発生している問題・エラーメッセージ

DBに登録したタスクを取得して、1つずつチェックボックス形式でブラウザ上に表示したいのですが、文字化けしてしまいます。
イメージ説明

### #!/usr/bin/env ruby # encoding: utf-8 begin require "cgi" cgi = CGI.new require "sqlite3" print cgi.header("text/html; charset=utf-8") #未達成のタスクをチェックボックス形式で表示 unfinished_task = [] db = SQLite3::Database.new("tasks.db") db.transaction(){ db.execute("SELECT name FROM mytbl WHERE state=0;"){|t| unfinished_task.push("<div><input type='checkbox' name='unfinished_task' value=#{t}>#{t}</div>") } } print <<EOF <html> <head> <meta charset = "utf-8" /> <title>レポート進捗</title> </head> <body> <h1>レポート進捗管理板</h1> <h3>みんなの進捗状況</h3> <h3>あなたの進捗状況</h3> <h3>残りのタスク</h3> 終わったらチェック&送信! <form action = "finished_task.rb" method="post"> #{unfinished_task.join("\n")} <input type="submit" value="送信"> </form> <h3>終わったタスク</h3> <h3>タスクの追加</h3> <form action = "new_task.rb" method="post"> 新しく登録するタスク名を入力してください<br> <input type="text" name="new_task"> <input type="submit" value="登録"> </form> </body> </html> EOF rescue => ex print <<-EOB <html> <body> <pre>#{ex.message}</pre> <pre>#{ex.backtrace}</pre> </body> </html> EOB end

データベースの中身は
「name」「state」の2つのカラムが用意されており、
「state」の値が0であるものの「name」をひとつずつ取得してチェックボックスで表示したいです。

試したこと

調べると、「文字化けは文字コードの問題」という記載を見かけました。
使用するテキストエディタ(ATOM)ではすべてUTF-8にしています。
他に直さなければいけないことがあるのでしょうか。
それ以外にどうすればよいかわかりませんでした・・・。

ターミナルでデータベースの中身を確認すると、文字化けせず読めました。

補足情報(FW/ツールのバージョンなど)

OSはLinux
エディタはATOM
です

投稿者、プログラミング初心者ですので、足りない情報、わかりづらい表現などあるかもしれません・・・。
申し訳ありませんが、ぜひお力を貸していただきたいです。

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

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

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

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

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

guest

回答2

0

ベストアンサー

文字化けよりも問題なこととして**[""]**で文字列が括られている事が問題です

どういうときにこうなるかというと、文字列をひとつだけ含む配列を(inspectやto_sなどで)文字列化した時に起こりえます。

ruby

1 db.execute("SELECT name FROM mytbl WHERE state=0;"){|(t)|

もしくは

ruby

1 db.execute("SELECT name FROM mytbl WHERE state=0;"){|t| 2 t = t[0]

で、配列から中身の文字列を取り出せば改善するかなと思います

投稿2019/01/11 04:55

asm

総合スコア15147

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

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

psycholodiver

2019/01/11 06:41

ありがとうございます! t[0]と表現することで、文字化けしなくなりました! もし、ご面倒でなければお尋ねしたいのですが、 今回、 "SELECT name FROM mytbl WHERE state=0;" の時点で、 nameは1次元配列として取得できており、 { | t | ..... 以下の処理では、配列の一つ一つの要素についての処理を行っているという認識でいました。 (実際は、tは0番目の要素だけを持つ配列でありました) この認識はどう間違っていて、次からどのように考えればよいのか、 差し支えなければご教授いただけないでしょうか・・・?
asm

2019/01/11 08:22

> nameは1次元配列として取得できており、 ここが間違い https://www.rubydoc.info/gems/sqlite3/SQLite3%2FDatabase:execute を見ても、クエリの結果の列数によって1次元配列か否かが決まるようには読めず そのような処理をしていないように思います。 > 次からどのように考えればよいのか 外部ライブラリなどから渡されたデータの場合、型(class)を確認する事がまず大事です。
psycholodiver

2019/01/14 00:57

お返事が遅れて申し訳ありません。 くわしい解説をありがとうございます! 以降、 1. データベースからのデータ取得の際、2次元配列であることに注意する 2. データの取得の際、データの型を確認する ようにします。 データの型はどのようにチェックすればよいのでしょうか…?
asm

2019/01/14 01:13

スタティックな方法としては、マニュアル類を読むことになります。 ダイナミックな方法としては、受け取った値のclassメソッドを呼び出すことで それがどのクラスに属しているか(もしくは、どのクラスとして扱えるか)が判別できます。 p [1,2,3].class #=> Array p [1,2,3][0].class #=> Integer
psycholodiver

2019/01/15 13:56

なるほど! .classで確認ができるんですね! ありがとうございます! 詳しく、迅速なご回答、ありがとうございました。
guest

0

tはまだ配列なので、

ruby

1#{t}

#{t["name"]}

で取り出さなければならないでしょう。

もしくは、encodeメソッドを使って、

ruby

1#{t["name"].encode("UTF-8")}

のような明示的な文字コードを指定してみてはどうでしょうか。

投稿2019/01/11 04:53

seastar3

総合スコア2285

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

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

psycholodiver

2019/01/11 06:34

教えていただき、本当にありがとうございます!! 配列に状態であったことが問題だったようです。 無事解決しました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問