プロが教える店舗&オフィスのセキュリティ対策術

【前提】
現在WindowsでRuby(2.6.6)とrails(5.2.4.4)を用いてWebアプリ開発をしています。
自分のレベルはプログラミングを初めて正味一か月程度の初心者です。

【内容】
windowsのコマンドプロンプトにおいて、rails console の中で例えば変数aに漢字"工藤"を入れようとすると、

"\x{E5B7}\xA5\x{E897}\xA4"

という値が入り、"新一"を入れようとすると、

SyntaxError ((irb):3: invalid multibyte char (Windows-31J))

というエラーメッセージが出てきてしまいます。調べるとこれは文字コードに関するエラーだということはなんとなくわかりました。以下のURL(一番上)を参考にすると環境変数RUBYOPTに-EUTF-8を入れるということをやっていたのですが、初めからRUBYOPTに-Eutf-8というのが入っていたのでそこが原因ではないのかもしれません。

また、ほかのwebサイトを参考にrails dbconsoleでpragma encoding;とすると、結果としてUTF-8が出力されたことも何か関係しているのでしょうか。

そもそも自分は文字コードという概念をしっかりと理解できていないのだと思われます。Windows-31JやUTF-8は文字コードの名前で、文字コードとはそれぞれの文字に対して割り当てられたコードだというような基本的なことはわかっているのですが、その使われ方がいまいちピンと来ていません。

例えば、文字コードというのは一つのpcに共通のものなのか、それとも、rubyやrails、sqliteだったりと、それぞれのプログラムファイルの中に一つずつ設定されているものなのでしょうか。もしそれぞれに設定されているものなら、pcはWindows-31Jでrails consoleはUTF-8を想定しているからこのようなエラーが発生していると考えることも可能でしょうか。

長文失礼しますが、よろしくお願いいたします。

【参考URL】
文字コードについて
https://qiita.com/scivola/items/95f257510ac82542 …
https://techracho.bpsinc.jp/hachi8833/2016_10_13 …
https://qiita.com/kono/items/2edc60b405ab96b03a80
sqliteと文字コード
https://iwakurabit.com/training-sqlite3-check-or …

質問者からの補足コメント

  • ちなみに、wsl2でのubuntuの仮想環境上でdockerを使ったときには、全く同じ状況でしっかりと漢字の値を入れることができたので、おそらくWindows-31Jという文字コードが原因にある気がします。

    (dockerでできるならそっちでやれという話ですが、何故か一つテーブルを作った後、二つ目のテーブルを作ろうとしたときにerrno13の権限エラーが発生してしまったのでローカルに切り替えたという背景があります…)

      補足日時:2020/09/11 05:03
  • 解決しました。皆さんどうもありがとうございました。ベストアンサーを決めると回答ができなくなるようなのでもう少しだけ開かせていただきます。

    どうやら、Windowsのコマンドプロンプトの文字コードがWindows-31Jに決まっているため、文字化けしたりときには(漢数字の時とか)syntax errorになったりするということでした。

      補足日時:2020/09/11 07:09
  • 今回の質問の背景として、自分はrails consoleを用いてテーブルに直接データを追加していくという力技をしようとしていました。
    結局、Windowsの提供するコマンドプロンプトの中ではWindows-31Jに逆えないので、もうそれには頼らず、データを追加する命令を書いたrubyのファイルを実行することが解決策になりました。

    環境依存変数の話や、ソースコードに文字コードを指定する話など、色々みていくうちに「文字コード」についての理解がかなり深まりました。どうもありがとうございました。

      補足日時:2020/09/11 07:09

A 回答 (6件)

最近は、文字コードについては、PC関連であまり大きく語られることは無い気がします。


でも、これはパソコンが「マイコン」と言われていた時代(CPU:8bit,主メモリ:16KB、外部記憶装置:ラジカセ等)から、しばしば話題になっていたものなんですね。
だから、パソコンを買ったら、何冊もマニュアルが付属していましたが、マニュアルの後ろのほうには、文字コード表が載っていました。

特にUTF-8などの規格が出てくる直前には、漢字を使う日本だけではなくて、世界のコンピュータ専門家たちがいろいろと文字コード規格の論争をやっていた気がします。

基本的にWindowsのコマンドプロンプトは、昔から文字コードとして、Shift-JIS(≒Windows31J≒MS漢字コード)を採用していたはずですので、UTF8を使うと、質問にあるように文字化けして表示されてしまいます。
また、その化け具合によっては、シンタックスエラーと表示されることになったりするでしょうね。

エクセル、ワード等だけを使う、単なるパソコンユーザであれば、文字コードはあまり気にしなくてもいいのですが、「Webアプリ開発者」となれば、文字コードは理解しておくことが必須ですからね。
といいながらも、私も先日、Webアプリを作っていて、そこで使うMySQLのデータベースの文字コードで何を指定すればいいか?ちょっと分からなくて調べたものです。
単にUTF8といっても、微妙な違いがあるコード体系があって、「UTF8」を指定するとしても、「UTF8mb4」ってのを指定しないと文字化けが発生することがあるなんて書かれていました。
で、Linux上のMySQLの設定を変更して、作りかけていたテーブルをもう一度再作成することになってしまいました・・・。
    • good
    • 2
この回答へのお礼

回答ありがとうございます。
文字コードについての理解が深まりました!

先程試しにrubyのファイルに
a=“新一”
puts a
と書いたファイルを作って実行したところ、ちゃんと”新一”が出力されました。

rubyのファイルを実行するときと、プロンプトの中のrails consoleで直接代入するときとでは使っている文字コードが違うという理解で良いでしょうか。(前者はUTF-8, 後者はWindows31J)

お礼日時:2020/09/11 06:29

新一の一は正しい漢字ですか?


入力の時に機種依存文字になっているのではないでしょうか。
カナ長音と符合のマイナスは違います。ハイフンの全角でなく図形のバーを
シンイチのイチとするからエラーになるのでしょう。
イチの正しい漢字をコピペして記載してはどうでしょうか。
    • good
    • 1
この回答へのお礼

回答ありがとうございます。
非常に参考になります!
色々試してみましたが、何故か漢数字だけsyntax errorになるようです…

確認したところ環境依存文字ではないので、不思議ですね…何か事情があるのでしょうか…

もう少し色々なことを試してみます。ありがとうございました!

お礼日時:2020/09/11 06:42

違ったかもしれません。


こっちてますかね…。
# coding: Windows-31J

変更するのではなく、下を加えれば良いかもしれません。この辺の知識は全くないので、上手く調整していただければと思います。
# encodng: utf-8
    • good
    • 1

Rubyもrailsも扱ったことがないので、的外れな回答かもしれませんが、ご容赦ください。



基本的に一般的に使用されている文字コード自体は機種依存文字を除き世界共通です。


エラーの内容も調べました。入力された文字列が想定されたWindows-31J以外であると言っているようです。

環境変数にEUTF-8を入れているのはコマンドプロンプトの文字コードをUTF-8にしているようなので、その辺りが関係しているのではないかと思います。

ソースコードの最初の方に下のような記述がありませんか?
# encoding: Windows-31J
これを下のように変えてみては如何でしょうか。
# encoding: utf-8
    • good
    • 1
この回答へのお礼

回答ありがとうございます。
今回はrails consoleという、プログラムを一つ一つ実行していけるような(自分の中ではGoogleコラボラトリーのパイソンのRuby版を使っているようなイメージです。正しいかどうかは別として…)中でのエラーなので、ソースファイル自体が存在しないということになりますかね…?自分もよくわかってないですが…

最初に#encoding: utf-8を実行すればそれ以降は文字コードとしてutf-8の方を使ってくれるのでしょうか…
参考になりました!早速試してみます!

お礼日時:2020/09/11 06:34

>名前の部分以外は全て同じように入力しました


どう入力したのか省略せず示した方がいい

「あるある」なのが
「xx以外は同じのつもり」が
実はそうでなかったというオチ
    • good
    • 1
この回答へのお礼

回答ありがとうございます。
rails consoleの中で
a=“工藤”を実行すると値が入り、
a=“新一”を実行すると上記のエラーが発生しました。
また、a=“新”とすると値が入り、
a=“一”とすると上記のエラーが発生したので、問題は”一”だと思います。

お礼日時:2020/09/11 05:42

>SyntaxError ((irb):3: invalid multibyte char (Windows-31J))



「SyntaxError」シンタックスエラー
文法のエラーだって表示されてるじゃん
    • good
    • 1
この回答へのお礼

回答ありがとうございます。
ということは、”工藤”は文法的にはオッケーで、”新一”はアウトだということでしょうか。
名前の部分以外は全て同じように入力しました。

お礼日時:2020/09/11 05:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!