
【前提】
現在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になるようです…
確認したところ環境依存文字ではないので、不思議ですね…何か事情があるのでしょうか…
もう少し色々なことを試してみます。ありがとうございました!

No.5
- 回答日時:
違ったかもしれません。
こっちてますかね…。
# coding: Windows-31J
変更するのではなく、下を加えれば良いかもしれません。この辺の知識は全くないので、上手く調整していただければと思います。
# encodng: utf-8

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で質問しましょう!
似たような質問が見つかりました
- PHP phpのメールフォームの完了画面でメール受信のコードを書いています。 1 2023/05/31 11:39
- Windows 8 メモ帳による文字コード変換 2 2022/09/01 18:38
- JavaScript ブックマークレットについて 2 2022/10/09 11:48
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- JavaScript フォームが空欄の時にフォームの外をクリックすると、エラーが出るコードを調べています。 1 2023/06/25 11:51
- JavaScript Javascriptが機能せず原因が分からないので教えて頂きたいです 3 2023/06/04 14:50
- UNIX・Linux テキストファイルをページ番号付きでコマンドラインから印刷したい 1 2023/02/22 12:47
- その他(プログラミング・Web制作) python質問 1 2023/08/14 11:54
- Ruby Gitのクローンについて 3 2022/04/10 12:28
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでfunctionを利用しようとし...
-
文字列内で括弧を使うには
-
String""から型'Double'への変...
-
お助けください!VBAのファイル...
-
UserForm1.Showでエラーになり...
-
マクロOn Error GoTo ErrLabel...
-
DBへのINSERT時に実行時エラー...
-
VBA 空白行の削除
-
On ErrorでエラーNoが0
-
【VB.NET】 パワポ操作を非表示で
-
HTMLソースが表示のページのも...
-
【VBA】ワークブックを開く時に...
-
インポート時のエラー「データ...
-
Filter関数を用いた結果、何も...
-
Excel vbaについての質問
-
INSERT INTOステートメント構文...
-
ACCESS DAO で不要なテーブルの...
-
条件式について
-
IIS7.0上でASP.netでAD情報取得...
-
ApplicationとWorksheetFunctio...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
UserForm1.Showでエラーになり...
-
お助けください!VBAのファイル...
-
VBAでfunctionを利用しようとし...
-
String""から型'Double'への変...
-
【VBA】ワークブックを開く時に...
-
文字列内で括弧を使うには
-
マクロで"#N/A"のエラー行を削...
-
Excel vbaについての質問
-
VBA データ(特定値)のある最...
-
On ErrorでエラーNoが0
-
ApplicationとWorksheetFunctio...
-
【Access】Excelインポート時に...
-
インポート時のエラー「データ...
-
実行時エラー 438 の解決策をお...
-
オブジェクト型の変数にフォー...
-
.VBSだとADODBのプロバイダが見...
-
実行時エラー'-2147467259(8000...
-
【VB.NET】 パワポ操作を非表示で
-
フランスの生年月日(jj/mm/aaaa)
-
【VBAエラー】Nextに対するFor...
おすすめ情報
ちなみに、wsl2でのubuntuの仮想環境上でdockerを使ったときには、全く同じ状況でしっかりと漢字の値を入れることができたので、おそらくWindows-31Jという文字コードが原因にある気がします。
(dockerでできるならそっちでやれという話ですが、何故か一つテーブルを作った後、二つ目のテーブルを作ろうとしたときにerrno13の権限エラーが発生してしまったのでローカルに切り替えたという背景があります…)
解決しました。皆さんどうもありがとうございました。ベストアンサーを決めると回答ができなくなるようなのでもう少しだけ開かせていただきます。
どうやら、Windowsのコマンドプロンプトの文字コードがWindows-31Jに決まっているため、文字化けしたりときには(漢数字の時とか)syntax errorになったりするということでした。
今回の質問の背景として、自分はrails consoleを用いてテーブルに直接データを追加していくという力技をしようとしていました。
結局、Windowsの提供するコマンドプロンプトの中ではWindows-31Jに逆えないので、もうそれには頼らず、データを追加する命令を書いたrubyのファイルを実行することが解決策になりました。
環境依存変数の話や、ソースコードに文字コードを指定する話など、色々みていくうちに「文字コード」についての理解がかなり深まりました。どうもありがとうございました。