![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67b6d)
【前提】
現在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 …
No.3ベストアンサー
- 回答日時:
最近は、文字コードについては、PC関連であまり大きく語られることは無い気がします。
でも、これはパソコンが「マイコン」と言われていた時代(CPU:8bit,主メモリ:16KB、外部記憶装置:ラジカセ等)から、しばしば話題になっていたものなんですね。
だから、パソコンを買ったら、何冊もマニュアルが付属していましたが、マニュアルの後ろのほうには、文字コード表が載っていました。
特にUTF-8などの規格が出てくる直前には、漢字を使う日本だけではなくて、世界のコンピュータ専門家たちがいろいろと文字コード規格の論争をやっていた気がします。
基本的にWindowsのコマンドプロンプトは、昔から文字コードとして、Shift-JIS(≒Windows31J≒MS漢字コード)を採用していたはずですので、UTF8を使うと、質問にあるように文字化けして表示されてしまいます。
また、その化け具合によっては、シンタックスエラーと表示されることになったりするでしょうね。
エクセル、ワード等だけを使う、単なるパソコンユーザであれば、文字コードはあまり気にしなくてもいいのですが、「Webアプリ開発者」となれば、文字コードは理解しておくことが必須ですからね。
といいながらも、私も先日、Webアプリを作っていて、そこで使うMySQLのデータベースの文字コードで何を指定すればいいか?ちょっと分からなくて調べたものです。
単にUTF8といっても、微妙な違いがあるコード体系があって、「UTF8」を指定するとしても、「UTF8mb4」ってのを指定しないと文字化けが発生することがあるなんて書かれていました。
で、Linux上のMySQLの設定を変更して、作りかけていたテーブルをもう一度再作成することになってしまいました・・・。
回答ありがとうございます。
文字コードについての理解が深まりました!
先程試しにrubyのファイルに
a=“新一”
puts a
と書いたファイルを作って実行したところ、ちゃんと”新一”が出力されました。
rubyのファイルを実行するときと、プロンプトの中のrails consoleで直接代入するときとでは使っている文字コードが違うという理解で良いでしょうか。(前者はUTF-8, 後者はWindows31J)
No.6
- 回答日時:
新一の一は正しい漢字ですか?
入力の時に機種依存文字になっているのではないでしょうか。
カナ長音と符合のマイナスは違います。ハイフンの全角でなく図形のバーを
シンイチのイチとするからエラーになるのでしょう。
イチの正しい漢字をコピペして記載してはどうでしょうか。
回答ありがとうございます。
非常に参考になります!
色々試してみましたが、何故か漢数字だけsyntax errorになるようです…
確認したところ環境依存文字ではないので、不思議ですね…何か事情があるのでしょうか…
もう少し色々なことを試してみます。ありがとうございました!
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_01.png?e8efa67b6d)
No.5
- 回答日時:
違ったかもしれません。
こっちてますかね…。
# coding: Windows-31J
変更するのではなく、下を加えれば良いかもしれません。この辺の知識は全くないので、上手く調整していただければと思います。
# encodng: utf-8
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_01.png?e8efa67b6d)
No.4
- 回答日時:
Rubyもrailsも扱ったことがないので、的外れな回答かもしれませんが、ご容赦ください。
基本的に一般的に使用されている文字コード自体は機種依存文字を除き世界共通です。
エラーの内容も調べました。入力された文字列が想定されたWindows-31J以外であると言っているようです。
環境変数にEUTF-8を入れているのはコマンドプロンプトの文字コードをUTF-8にしているようなので、その辺りが関係しているのではないかと思います。
ソースコードの最初の方に下のような記述がありませんか?
# encoding: Windows-31J
これを下のように変えてみては如何でしょうか。
# encoding: utf-8
回答ありがとうございます。
今回はrails consoleという、プログラムを一つ一つ実行していけるような(自分の中ではGoogleコラボラトリーのパイソンのRuby版を使っているようなイメージです。正しいかどうかは別として…)中でのエラーなので、ソースファイル自体が存在しないということになりますかね…?自分もよくわかってないですが…
最初に#encoding: utf-8を実行すればそれ以降は文字コードとしてutf-8の方を使ってくれるのでしょうか…
参考になりました!早速試してみます!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UserForm1.Showでエラーになり...
-
String""から型'Double'への変...
-
【Access】Excelインポート時に...
-
VBAでfunctionを利用しようとし...
-
【VBA】ワークブックを開く時に...
-
お助けください!VBAのファイル...
-
On ErrorでエラーNoが0
-
文字列内で括弧を使うには
-
インポート時のエラー「データ...
-
マクロで"#N/A"のエラー行を削...
-
実行時エラー'-2147467259(8000...
-
IISの仮想ディレクトリ作成がわ...
-
Excel vbaについての質問
-
マクロの「SaveAs」でエラーが...
-
【VB.NET】 パワポ操作を非表示で
-
演算子が DBnull 及び integer...
-
VBでSQL文のUPDATE構文を使った...
-
【VBAエラー】Nextに対するFor...
-
コンボボックスの特定項目だけ...
-
Excel実行時エラー[80004005]に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UserForm1.Showでエラーになり...
-
VBAでfunctionを利用しようとし...
-
【VBA】ワークブックを開く時に...
-
文字列内で括弧を使うには
-
Pythonでの文字列からfloatへの...
-
String""から型'Double'への変...
-
On ErrorでエラーNoが0
-
お助けください!VBAのファイル...
-
2つほどお聞きしたいことがあり...
-
マクロで"#N/A"のエラー行を削...
-
Excel vbaについての質問
-
【VBAエラー】Nextに対するFor...
-
実行時エラー 438 の解決策をお...
-
実行時エラー'-2147467259(8000...
-
ACCESSで値を代入できないとは?
-
VBA データ(特定値)のある最...
-
「実行時エラー '3167' レコー...
-
【VB.NET】 パワポ操作を非表示で
-
マクロの「SaveAs」でエラーが...
-
ApplicationとWorksheetFunctio...
おすすめ情報
ちなみに、wsl2でのubuntuの仮想環境上でdockerを使ったときには、全く同じ状況でしっかりと漢字の値を入れることができたので、おそらくWindows-31Jという文字コードが原因にある気がします。
(dockerでできるならそっちでやれという話ですが、何故か一つテーブルを作った後、二つ目のテーブルを作ろうとしたときにerrno13の権限エラーが発生してしまったのでローカルに切り替えたという背景があります…)
解決しました。皆さんどうもありがとうございました。ベストアンサーを決めると回答ができなくなるようなのでもう少しだけ開かせていただきます。
どうやら、Windowsのコマンドプロンプトの文字コードがWindows-31Jに決まっているため、文字化けしたりときには(漢数字の時とか)syntax errorになったりするということでした。
今回の質問の背景として、自分はrails consoleを用いてテーブルに直接データを追加していくという力技をしようとしていました。
結局、Windowsの提供するコマンドプロンプトの中ではWindows-31Jに逆えないので、もうそれには頼らず、データを追加する命令を書いたrubyのファイルを実行することが解決策になりました。
環境依存変数の話や、ソースコードに文字コードを指定する話など、色々みていくうちに「文字コード」についての理解がかなり深まりました。どうもありがとうございました。