読者です 読者をやめる 読者になる 読者になる

Rubyの勉強(1)

気象庁が公開している気象データを使って、どうにかできないかなと遊んでます。
とりあえず、以下のサイトを参考にプロトタイプを作成したいと思います!


itpro.nikkeibp.co.jp


まず、気象データをデータベースに保存するっぽい。
とりあえず、RubyMySQLに接続する方法を確認するために、既にある情報をフェッチしてみよう。


文字化け

サーバ上でMySQLからデータを取得し、表示しようとすると文字化けしてしまうという問題が発生…
発生している問題としては、以下のとおり。

# ruby xxxx.rb 
??????????????
??????????
?????????
?????
?????????? ?????

データベースが問題!?

phpMyAdminからデータベースの構造を確認しても、ちゃんと「utf8_general_ci」となってるので問題なさそう。
そうなると、やっぱりソースコードが原因か…


既存のソースコードと比較

前にRubyで作成したメール通知プログラムのソースコードと比較して問題の原因を探してみた。

#!/usr/bin/ruby -Ku
require 'kconv'
    ・
    ・
    ・

冒頭部分に上の2つが書いていた。


「#!/usr/bin/ruby -Ku」とは!?

答えとなるようなサイトは見つからなかったけど、指定したRubyで実行させるようにしてるっぽい。
意味的には、yumの設定ファイル(/usr/bin/yum)の冒頭文に書かれている

#!/usr/bin/python2.6.6   
import sys
try:
    import yum
except ImportError:
    print >> sys.stderr
    ・
    ・
    ・

と同じ感じなのかな?
(上のコードでは、Pythonのバージョンを2.6.6に指定している)

「require 'kconv'」とは!?

kconv」はRuby文字コードを変換するための標準ライブラリらしいです!

# _*_ coding: utf-8 _*_
require 'kconv'
 
str_sjis = "文字列".tosjis
str_utf8 = "文字列".toutf8
 
puts "#{str_sjis.encoding} => #{str_sjis}"
puts "#{str_utf8.encoding} => #{str_utf8}"

参考:Rubyで文字コードを変換 ‘kconv’ | rakkyooの備忘録

以上の2つを試して見ても、問題が解決できず…


解決策

元々、データベースにアクセスし、データを取得するソースコードは以下のようでした。

require 'mysql'

hostname = "127.0.0.1"
username = "xxxxx"
password = "xxxxx"
dbname = "xxxxx"
connection = Mysql.connect('hostname', 'username', 'password', 'dbname')

result = connection.query('SELECT * FROM table_name')

けど、データベースにアクセスする時点で文字コードを設定しなくちゃいけなかったっぽい
修正したソースコードは以下のとおり。

require 'mysql'

hostname = "127.0.0.1"
username = "xxxxx"
password = "xxxxx"
dbname =  "xxxxx"
connection = Mysql.init()
connection.options(Mysql::SET_CHARSET_NAME,'utf8')
connection.real_connect(hostname, username, password, dbname)
result = connection.query('SELECT * FROM table_name')

参考:Ruby Mysqlで文字化け? - まめ畑


これで一件落着!
てか、そもそもMySQLに接続する書き方が

connection.real_connect(hostname, username, password, dbname)

とか

connection = Mysql.connect(hostname, username, password, dbname)

があって、よく分からないな…