• 締切済み

Ruby defにするとエンコードがおかしくなる

あるif文をdefでまとめて動かしたところ、西欧のエンコードで表示されてしまうのですが、 これはエラーですよね?正しい動作にならないのですが、どうしたらよいでしょうか。 def search_kansi(h) if h == 1 kansi = "甲子" elsif h == 2 kansi = "乙丑" elsif h == 3 kansi = "丙寅" else kansi ="無効な値が入力されました" end return kansi end #def nikkan = search_kansi(h) print nikkan

  • Ruby
  • 回答数3
  • ありがとう数1

みんなの回答

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.3

>ブラウザ表示時に西欧のコードで文字化けしてしまうんですよ。 文字コードを指定していないせいでしょうね。 ちゃんと指定しましょう。 もしこれがcgiで、これだけで全体のプログラムなのだとすると、先頭で、 print "Content-Type: text/plain; charset=Shift_JIS\n\n" そうじゃないのだったらどこかでこれに類することをしてください。

cutisei
質問者

補足

補足を見てください。

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.2

ちゃんと動きますけど。 >西欧のエンコードで表示されてしまうのですが、 は、具体的にどういう現象ですか? 普通のコマンドプロンプトで動かしているのですよね?

cutisei
質問者

補足

エディタでソースコードを記述してFTPにアップしてます。 ブラウザ表示時に西欧のコードで文字化けしてしまうんですよ。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

補足要求: 漢字コードの指定もしくはエンコーディングの指定をきちんと行えば問題ないかと思います。 その為には、 使用されているrubyのバージョン 使用されているOS(windows-xp,windows7,linux等)の情報も必要になります。 windowsであれば、プログラムを記述している文字コードはシフトJIS linuxであれば、プログラムを記述している文字コードはEUC になりますが、もし、意図的にほかの文字コードでプログラムを 記述している場合は、その旨も補足して下さい。

cutisei
質問者

補足

#!/usr/local/bin/ruby -Ks # -*- coding:shift_jis -*- $KCODE = 'SJIS' を宣言済みです。 バージョンは1.8.7 OSはwindowsXPです。 意図的にシフトJISを使用しています。 ケータイ用も考えていますので。 よろしくお願いいたします。

関連するQ&A

  • Rubyプログラミングの課題について☆

    大学のレポートで下のような課題が出て、実際プログラムを自分で作って実行してみたのですが、全く無反応でいくら考えても原因がわかりません(T_T)批判されそうな質問かもしれないですが、留年かかっているので親切な方、助言お願いします。。 ●下の動作をするプログラム(a.rb)を作れ  %a.rb "+[1,20] =>21 %a.rb "*[-1,25,4] =>-100 ●作ってみたプログラム↓ class Array def list_ope d=0 #最終的に返す値 s=0 #状態番号 x="" #一時的に数値を入れる op="" #[+,-,*,/] sgn=1 #マイナスの符号のあるなし err=999999 self.each{|i| case s #とりあえず、[+,-,*,/]をopに代入 when 0 op=i s=1 when 1 if /\[/ =~ i  s=2 else s=err; bleak end when 2 sgn=1; x=0; if /[1-9]/ =~ i #1~9の時 x+=i; s=3 elsif /-/ =~ i #マイナスの時 sgn=-1; s=3 else s=err; bleak end when 3 if /[0-9]/ =~ i #0~9の時 x+=i; elsif /,/ =~ i #コンマの時 x=sgn*x.to_i; s=4 elsif /\]/ =~ i #]の時 x=sgn*x.to_i; s=5 else s=err; bleak end when 4 #コンマの時の処理 if /\+/ =~op d=d+x elsif /-/ =~ op d=d-x elsif /\*/ =~ op d=d*x elsif / =~ op d=d/x end s=2 when 5 #]のときの処理 if /\+/ =~op d=d+x elsif /-/ =~ op d=d-x elsif /\*/ =~ op d=d*x elsif / =~ op d=d/x end s=6 #終了状態 end } if s==6 return d #dを返す else print "error!" end end end

  • PHPのエンコードについて教えて下さい。本のサンプルに

    PHPのエンコードについて教えて下さい。本のサンプルに function h($var) { // HTMLでのエスケープ処理をする関数 if (is_array($var)) { return array_map('h', $var); } else { return htmlspecialchars($var, ENT_QUOTES); } } と書いてあり、もし配列だったらhtmlエンコードしてはいけず、配列ではなかったらhtmlエンコードするような意味だと思うのですがどうして配列だったらhtmlエンコードしてはいけないのですか??? お手数かけますが教えて下さい。お願いします。

    • ベストアンサー
    • PHP
  • Rubyのプログラムについて

    Rubyのプログラムについて、宜しければ教えてください。 def fct(n, f=1) if n<=1 then f else fct(n-1, n*f) end end def factorial(n) (1..n).inject{|x,y| x*y} end def factorial(n) eval( [*(1..n)].join("*") ) end このプログラムが、階乗を計算するメソッドになっているみたいなのですが、なぜコレだけで階乗が計算できるのでしょうか? 宜しければ教えてください><

    • ベストアンサー
    • Ruby
  • Ruby/SDLの処理を早くしたい

    Ruby/SDLを使ってブロック崩しを制作しているのですが画面いっぱいにブロックを並べたら処理が落ちて困っています。なにか軽くする方法を教えていただけないでしょうか?お願いします。 ソース抜粋 重要そうなところだけ抜粋してみました require "sdl" require "lib/fpstimer" SCREEN_W = 640 SCREEN_H = 480 def load_image(fname) image = SDL::Surface.load(fname) image.set_color_key(SDL::SRCCOLORKEY, [255, 255, 0]) image end SDL.init(SDL::INIT_EVERYTHING) screen=SDL.set_video_mode(SCREEN_W, SCREEN_H, 16,SDL::SWSURFACE) ball = load_image("image/ball.png") bar = load_image("image/bar.png") block = [load_image("image/block1.png"), load_image("image/block2.png"), (略します) load_image("image/block9.png")] board =[[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0], (略します 25*32) [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]] loop do screen.fillRect 0, 0, 640, 480, [ 0, 0, 0 ] speedX = 5 if speedX > 5 speedY = 5 if speedY > 5 speedX = -5 if speedX < -5 speedY = -5 if speedY < -5 SDL::Key.scan if SDL::Key.press?(SDL::Key::SPACE) barX -= 12 if SDL::Key.press?(SDL::Key::LEFT) barX += 12 if SDL::Key.press?(SDL::Key::RIGHT) else barX -= 8 if SDL::Key.press?(SDL::Key::LEFT) barX += 8 if SDL::Key.press?(SDL::Key::RIGHT) end if ballenterflag == 0 if SDL::Key.press?(SDL::Key::RETURN) ballenterflag = 1 end if SDL::Key.press?(SDL::Key::LEFT) if SDL::Key.press?(SDL::Key::RETURN) ballenterflag = 2 end end end #バーとボールの判定 if fallball == 0 if ballX + 6< barX + 96 && ballX + 6 > barX && ballY+ 6 > barY - 2 && ballY + 6 < barY + 12 + 2 # 周りにヒット if SDL::Key.press?(SDL::Key::LEFT) if speedX >= 0 && speedY >= 0 speedX = speedX / 1.2 speedY = speedY *1.2 elsif speedX < 0 && speedY > 0 speedX = speedX * 1.2 speedY = speedY / 1.2 end elsif SDL::Key.press?(SDL::Key::RIGHT) if speedX >= 0 && speedY >= 0 speedX = speedX * 1.2 speedY = speedY / 1.2 elsif speedX < 0 && speedY > 0 speedX = speedX / 1.2 speedY = speedY * 1.2 end end speedY = -speedY if ballX + 6< barX + 52 && ballX + 6 > barX + 44 && ballY+ 6 > barY - 2 && ballY + 6 < barY + 12 + 2 #真ん中ヒット kantuu = 1 elsif kantuu = 0 scoreplus = 200 end fallball = 1 #1ならボールを跳ね返さない end end for i in 0..25 for j in 0..32 #高さ if board[j][i] == 1 screen.put(block[0], blockX+i*24, blockY+j*12) elsif board[j][i] == 2 screen.put(block[1], blockX+i*24, blockY+j*12) 略します 1~10です elsif board[j][i] == 10 screen.put(block[9], blockX+i*24, blockY+j*12) end if board[j][i] != 0 if (ballX + 6 > blockX + i*24 && ballX + 6 < blockX + i*24 +24) && ((ballY + 6 > blockY + j*12 -3 && ballY + 6 < blockY + j*12 + 3) || (ballY + 6 > blockY + j*12 + 12 -3 && ballY + 6 < blockY + j*12 +12 + 3)) if kantuu == 0 speedY = -speedY end board[j][i] = 0 score += scoreplus scoreplus += 50 elsif (ballY + 6 > blockY + j*12 && ballY + 6 < blockY + j*12 + 12) && ((ballX + 6 > blockX + i*24 -2 && ballX + 6 < blockY + i*24 +3) || (ballX + 6 > blockX + i*24 + 24 -3 && ballX + 6 < blockY + i*24 +24 +2)) if kantuu == 0 speedX = -speedX end board[j][i] = 0 score += scoreplus scoreplus += 50 end end end end screen.put(ball, ballX, ballY) timer.wait_frame do screen.update_rect(0, 0, 0, 0) end end

  • defファイルの扱い方

    DEFファイルをつくったら、同じフォルダに入れておけば、コンパイルするときに自動的に影響を与えてくれるのでしょうか? しかしそれではできないようなので、DEFファイルをコンパイルオプションなどに織り込んで明示しなければいけないのでしょうか? 例 //mydll.c int returnInt(int a){ return a; } これをコンパイルしてmydll.dllに。 //mydll.def LIBRARY mydll EXPORTS returnInt @1 NONAME これを同じディレクトリに。 //usedll.c #include <windows.h> int main(){ &nbsp;HINSTANCE hinstDLL; &nbsp;FARPROC pProc; &nbsp;hinstDLL = LoadLibrary("mydll.dll"); &nbsp;if(!hinstDLL){ &nbsp;&nbsp;puts("hinstDLL is NULL"); &nbsp;&nbsp;return 0; &nbsp;} &nbsp;pProc = GetProcAddress(hinstDLL, MAKEINTRESOURCE(1)); &nbsp;if(!pProc){ &nbsp;&nbsp;puts("pProc is NULL"); &nbsp;&nbsp;return 0; &nbsp;} &nbsp;printf("%d\n",pProc(9)); &nbsp;return 0; } これで使おうとしたらGetProcAddressの戻り値がNULLでした。 なにがいけないんでしょう?

  • Rubyのイテレータ

    Rubyのイテレータで分からないところがあります。以下のコードです。 if文のところで「yield x」が真なら「return x」を実行すると 推測できるのですが、 その実行結果はこれです。 > irb> a = [1, 2, 3, 4, 5] > => [1, 2, 3, 4, 5] > irb> find(a) {|x| x % 2 == 0} > => 2 > irb> position(a) {|x| x % 2 == 0} > => 1 > irb> count(a) {|x| x % 2 == 0} > => 2 例えば、find関数なら引数は「x」ですが「x % 2 == 0」 と条件式をブロックに書いているのが分かりません。 全体の流れとしてはfind関数なら2で割り切れたのが「2」と「4」で2つあるので 関数の結果は「2」というのは理解できます。 しかし、具体的に「return x」「 if yield x」が何をしているのかが分かりませんでした。 if「もし」yield x「なら」return xを実行する、様なコードなのですが・・・。 またfind(a)なら、引数xが2で割り切れるのなら条件式は「真」なので 真の数字をカウントする、様なコードなのですが・・・。それ以上詳細に教えてくれると助かります。 何方かご存知でしたら教えてください。 > リスト 1 : データの探索 (イテレータ版) > > # ブロックが真となる要素を探す > def find(ary) > for x in ary > return x if yield x > end > false > end > > # ブロックが真となる要素の位置を返す > def position(ary) > for x in 0...ary.size > return x if yield ary[x] > end > false > end > > # ブロックが真となる要素の個数を求める > def count(ary) > c = 0 > for x in ary > c += 1 if yield x > end > c > end なおこのコードが載っているサイトはここです。 http://www.geocities.jp/m_hiroi/light/abcruby08.html

    • ベストアンサー
    • Ruby
  • Ruby での計算

    お世話になります。 Ruby の初心者です。 以下のコードをノートパッドで作成して実行したいのですが、ロードしたのちに数値を代入するとエラーが表示されてしまいます。どこがいけないのでしょうか。 よろしくお願いいたします。 def triarea(w, h) s=(w*h)/2 return s end

  • どこが間違いか分かりません。(Ruby)

    Rubyを使ったプログラムが巧く行かないのですが、どこでエラーが出ているのか分かりません。どなたか何が原因でエラーが起こったのか教えて頂けないでしょうか。 以下ソースコードです。 class SolitaireCipher $deck = (1..52).to_a+['A','B'] def solitaire(count) key_stream = [] until key_stream.size == count a = $deck.index("A") $deck.delete("A") if a == 53 a = 0 else a += 1 end $deck.insert(a,"A") b = $deck.index("B") $deck.delete("B") if b == 52 b = 1 elsif b == 53 b = 2 else b = b+2 end $deck.insert(b,"B") a1 = $deck[0..b-1] a2 = $deck[b..a] a3 = $deck[a+1..53] $deck = a3+a2+a1 if $deck[53] == 'A' t1 = 27 elsif $deck[53] == 'B' t1 = 27 else t1 = $deck[53] end a4 = $deck[0..t1-1] $deck = ($deck-a4).insert(52,a4).flatten! i = $deck[0].to_i key = $deck[i] key_stream << key end key_stream_s = key_stream.join n = 5 while n < key_stream_s.size key_stream_s[n,0] = " " n += 6 end key_stream = key_stream_s.split(" ") end end s = SolitaireCipher.new p s.solitaire(20) このプログラムを実行したときに、どういう訳かuntil文の中で毎回$deckの値が初期化されるようです。 そのため結果が以下のようになります。 ["44444", "44444", "44444", "44444"] 初心者プログラマーなので何か初歩的な間違いをしているのかもしれません。 どなたかエラーの原因を教えて頂けないでしょうか。 読みにくいプログラムではありますがよろしくおねがいします。

  • Ruby バブルソート

    バブルソートのプログラムでわからないところがあるため、 質問させていただきます。 Rubyは1.9.3を使用しています。 <プログラム> --------------------------------------------------- def bsort(data)   while true     # swapped変数は数値の入れ替えを記憶     swapped = false     for i in 0..data.size-2       if data[i] > data[i+1]         temp = data[i]         data[i] = data[i+1]         data[i+1] = temp         swapped = true       end     end     return if !swapped   end end data = [10, 9, 8, 7, 6] bsort(data) puts "ソート結果#{data}" --------------------------------------------------- return if !swapped のところで、 なぜwhileのループから抜けられるのかがよくわかりません。 return if swapped == false と書き換えて実行しても同じ結果が得られたのですが、 数値の入れ替えがなければ swapped = false であるため、 !swappedはtrueとはならないのでしょうか。

  • 【ruby】 『クラスの生成に失敗』を表現したい

    『クラスの生成に失敗』を表現したいのです。 newの戻り値にnilやfalseを返せばよいと考え、 以下の様に書いてみました。(行頭は全角スペースです。) class Hoge  def initialize(arg)   return arg  end end h = Hoge.new(false) STDERR.puts 'err' unless(h) errはputsされませんでした。(グーグルで調べるとinitializeのreturnは、返ってこないそうでした。) そこで以下の様に書きました。(行頭は全角スペースです。) class Hoge  attr_reader :stat  def initialize(arg)   @stat = arg  end end h = Hoge.new(false) STDERR.puts 'err' unless(h.stat) なんか、ものすごく我流になってる気がします。。。 アドバイスをお願いいたします。

    • ベストアンサー
    • Ruby

専門家に質問してみよう