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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Q&A

解決済

2回答

1311閲覧

Rubyで文字コードANSIのファイルを読み込んで何も変換せずencodingメソッドを使ってもUTF-8になるのはなぜですか?

say4hatii8

総合スコア28

Ruby

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

1グッド

1クリップ

投稿2020/03/10 04:02

Rubyで文字コードANSIのファイルを読み込んで何も変換せずencodingメソッドを使ってもUTF-8になるのはなぜですか?
ローカルのファイルを扱うときは、どの文字コードかわかりきっているので処理のコードが書けます。
しかし、例えば文字コードを知らずに外部から預かったCSVファイルでエンコードエラーが出ます。文字コードがcp932とわかっていれば、

ruby

1csvfile = CSV.read("test.csv", encoding: 'cp932:UTF-8')

と書くことができます。
しかし、例えば文字コードがANSIコードファイルをencodingメソッドを使ってもUTF-8で表示されてしまい、元の文字コードがわからない場合、どのようにして、元の文字コードを確認すればよろしいでしょうか?

DrqYuto👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

元の文字コードの確認は、
・文字コードを自動判別するエディタなどを使って開いてみる
・文字コードを指定して開けるエディタを使って、想定される文字コードを順に試してみる
等で、人間の目で見て判断します。

Rubyプログラムでも、自動判断などは可能ですが、例えばShift_JISとしてもeuc-jpとしてもあり得る文字だけからなる文字列だと、間違えて判断する可能性があります。

一応、プログラムでの方法としては、
・特定のエンコーディングを仮定して不正な文字が無いか⇒force_encodingしてscrub
・判断を任せる⇒NKF.guess

投稿2020/03/10 04:26

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2020/03/10 04:28

> Rubyで文字コードANSIのファイルを読み込んで何も変換せずencodingメソッドを使ってもUTF-8になるのはなぜですか? については、具体的に何を言ってるのかわからないので、コードを書いてください。
say4hatii8

2020/03/10 05:15

申し訳ございません。Windowsのメモ帳で「a,1(改行)i,2」と書いて、文字コードを「ANSI」で、ファイル名を「test.csv」で保存します。そして、test.rbを作成し、コードはf = File.read("test.csv")(改行)p f.encoding こちらをcmdで「ruby test.rb」すると結果が#<Encoding:UTF-8>になってしまいます。
maisumakun

2020/03/10 05:21

> 結果が#<Encoding:UTF-8>になってしまいます。 何か問題があるのでしょうか?ASCIIはUTF-8の部分集合なので、ASCIIだけのテキストファイルをUTF-8と解釈してもまったく矛盾しません。
otn

2020/03/10 05:39

> すると結果が#<Encoding:UTF-8>になってしまいます。 それはファイルの中身を見ているわけじゃないです。 open時に指定されたエンコーディング、あるいは指定されていない場合は、default_externalが使われます。 > Windowsのメモ帳で「a,1(改行)i,2」 だと、いわゆる半角文字のみ(US-ASCII)なので、US-ASCII、UTF-8、Shift_JIS、euc-jpなど全部共通部分なので、どれでも合ってます。
say4hatii8

2020/03/10 05:40

何度も申し訳ございません。サンプルを雑にしてしまいました。正確には、 「 伝票番号,地域,電話番号 0001,札幌,011-00 0002,仙台,022-00 」 というcsvだとします。 あと私が理解していませんでした。以前ANSIについて調べたところ、Shift_JISやcp932と記載がありましたので、UTF8ではないと思っていました。
say4hatii8

2020/03/10 05:42

ありがとうございます。「ファイルの中身を見ているわけじゃない」「default_external」こちらも知らなかったです。私が理解不足でメソッドを使用しているからですね。申し訳ございません。
otn

2020/03/10 05:43

> サンプルを雑にしてしまいました。 それではさっきのコメントの後半は関係ないです。 > UTF8ではないと思っていました。 ANSIはUTF-8じゃないですよ。
say4hatii8

2020/03/10 05:58

申し訳ございません。文字コードについてもう一度自分で調べてみます。
guest

0

元の文字コードがわからない場合、どのようにして、元の文字コードを確認すればよろしいでしょうか?

厳密に言えば、どうしようもありません。世界各国のあらゆる言語について考えれば、文字コードの種類は多数存在しますので、全部を完璧に判定する方法はありません。

いちばん楽なのは、アップロード側に、たとえば「UTF-8でアップロードしてください」と書いておいて、それ以外の形式ではエラーにしてしまう方法です。

投稿2020/03/10 04:12

編集2020/03/10 04:13
maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

say4hatii8

2020/03/10 05:04

ありがとうございます。制限をかける方法だと確かに自分のルールの中で処理ができるので、とてもいい方法ですね。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問