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

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

ただいまの
回答率

90.35%

  • Ruby

    10209questions

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

  • Vim

    604questions

    VimとはUnix / Linux 系のOSに標準搭載されているターミナル上で動くテキストエディタです。

同じ文字列が一致しない

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 101

kanego

score 1

前提・実現したいこと

はじめまして。

まだ初心者ですが何かを作ってみたいと思い、しりとりをするプログラムを作成しています。

具体的には入力ファイルから単語を選び、ユーザーの入力に対してしりとりを行う仕様です。

現在は、特定の文字列でしりとりを終了するコードを作成しています。

質問はそのテストコードに関してです。

発生している問題

input_file内の文字「パナキ」とtest.rb内で定義した文字列「パナキ」が一致しません。

if文により、この2種類の文字列が一致するかどうかを確かめました。
どちらも同じ文字列なのだから、trueを返すかと思いました。
しかし、実際は予想と違い、falseが返されました。

以下の2点について、どなかたご教示ください。
・これはどういった違いから生じるのか?
・2つの文字列がtrueを返すにはどうすればいいか?

######################################

test.rb

array = Array.new

i = 0
j = 0
file = File.open("input_file")
file.each{|line|
array[i] = line.strip
i += 1
}
file.close
file_string = array[0]  # input_fileから読み込んだ文字列
string = "パナキ"       # このファイルで定義した文字列

print "file_stringのクラス  ",file_string.class,"\n" 
print "stringのクラス       ",string.class,"\n" 

print "file_string          ";p file_string
print "string               ";p string

if file_string == string
puts "2つの文字列は一致します"
elsif
puts "2つの文字列は一致しません"
end

###################################

input_file

イメージ説明

コマンドライン

イメージ説明

試したこと

・2つの文字列に対して,pコマンドを実行しました.
一方は「パナキ」と表示され、もう一方は「\u30D1\u30CA\u30AD」と表示されました。
この違いが原因であると思いましたが、解決には至りません。

・文字コードはinput_file、test.rbいずれも「utf-8」です。

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

入力ファイルです。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

あなたと同じ現象が発生する環境を再現してみました。
イメージ説明

この環境は、以下のようになっています。
input_fileの文字コード:シフトJIS
test.rbの文字コード:utf-8
コマンドプロンプトの文字コード:シフトJIS

あなたの環境で、
type test.rb
と入力してください。
これは、test.rbの内容を画面に表示するコマンドです。
以下のような、文字化けした内容が表示されるはずです。
イメージ説明

正しい結果を得るためには、すべての文字コードを同じにする必要があります。
1.コマンドプロンプトをutf-8にします。
下記のURLを参考にしてください。
参考URL1
参考URL2

2.input_fileがutf-8かどうか再度確認してください。シフトJISのように思われます。
現在、編集中の文字コードが表示できるエディタで文字コードを確認してください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/16 10:54

    ご回答いただきありがとうございます!
    tatsu99さんのご指摘通りにしたところ,文字列の一致が確認できました!
    原因としましては,
    ①コマンドプロンプトの文字コードがWindows-31Jであったこと.
    ②input_fileの文字列「パナキ」の文字コードがWindows-31Jであったこと.

    ②に関しては,質問投稿前に:set enc?コマンドでutf-8と表示されたので,input_file内の「パナキ」の文字コードもutf-8であると勘違いしていまいました.
    それが原因で嘘の事前情報を送ってしまい,申し訳ございません.
    改めて,ミスの再現,URLを含めた詳細な解説,情報の整理がしやすい簡潔な説明をいただきありがとうございます!!!

    キャンセル

0

print "file_stringのエンコーディング  ",file_string.encoding,"\n" 
print "stringのエンコーディング       ",string.encoding,"\n"  


を追加すると分かると思います。

WindowsのRubyは、Encoding.default_externalのデフォルトがWindows-31J(シフトJISのMS拡張)になっていますので、utf-8のファイルを読むときは、openでエンコーディングを指定します。

別解としては、Encoding.default_external = "utf-8"open前に実行しておきます。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/14 22:40

    > WindowsのRubyは、デフォルトが Windows31J
    と書きましたが、Windows用Rubyは何種類かあるので、全部かどうか分かりません。
    少なくともRubyInstallerはそうです。

    キャンセル

  • 2019/08/16 11:04

    otnさん
    ご回答いただきありがとうございます.
    ご教示いただいたコマンドを実行したところ
    file_stringがWindows-31J,stringがutf-8と表示されました.
    この情報と他の方のアドバイスが決め手となり,解決へとつながりました.
    本当にありがとうございます.
    ベストアンサーを差し上げられず,申し訳ございません..

    キャンセル

  • 2019/08/16 11:20

    > ・文字コードはinput_file、test.rbいずれも「utf-8」です。

    これが、間違っていたと言う事ですかね。
    文字エンコーディングがわかるエディタを使いましょう。もしくは使っているエディタを理解しましょう。

    > :set enc?コマンドでutf-8と表示されたので,
    encoding はバッファのエンコーディングですね。ファイルのエンコーディングは fileencoding です。

    キャンセル

  • 2019/08/16 14:56

    > これが間違っていたということですね

    その通りです。
    利用エディタに対する理解不足でした。vimの文字コーディングが表示される方法を調べてみて、なさそうなら他のエディタに変えることも視野に入れようと思います。

    > encording はバッファのエンコーディングですね。 ファイルのエンコーディングは fileencoding です。
    バッファとファイルの区別がついていませんでした。自分で調べたときは、これらの区別が曖昧なまま理解していたので、両者の違いについて勉強します。

    otnさん、重ね重ね感謝しますm(._.)m

    キャンセル

0

「\u30D1\u30CA\u30AD」

これは、utf-16の文字コードですね。
vimの設定が、utf-16になってませんか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/08/16 10:56

    pepperleafさん
    ご回答いただきありがとうございます.
    vim画面にて,「:set enc?」を試したところ,「utf-8」と表示されました.

    キャンセル

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

  • ただいまの回答率 90.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Ruby

    10209questions

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

  • Vim

    604questions

    VimとはUnix / Linux 系のOSに標準搭載されているターミナル上で動くテキストエディタです。