こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

文字コードの判別について

とあるテキストファイルがあります。UNIX上で文字コードの判別を行いたいのですが、nkf --guess test.txtと打って調べると、
test.txt: ASCII (CRLF)
となります。このファイルは、Shift-JISだという判定だと思います。

ファイルをUTF8に変換したいので、(1)Windows上のエディタ(秀丸)の機能を使ってUTF8に変換してからUNIX上にアップロードしたり、また(2)UNIX上から直接nkf -w --overwrite test.txtを実行して変換したりしたのですが、nkf --guess test.txtを打って調べると相変わらず
test.txt: ASCII (CRLF)
のままです。

色々調べた結果、ファイルの中身が英数字のみしか書かれていないので、nkfがこのファイルをShift JISだと「推測」しているということがわかってきました。確かに、試しにファイルの中身に日本語を書いて保存して実行してみると、ようやくnkf --guess test.txtの結果が
test.txt: UTF-8 (CRLF)
と表示されるようになりました。

これらの結果は、ファイルの中身のマルチバイト文字のコードを見て初めて文字コードがわかるようになるというように思えます。

私の理解ではファイル自体にEUCやShift JIS、UTF-8などの文字コードがあるものとばかり思っておりました。つまり、test.txtの内容が"This is a pen."であったとしてEUC、Shift JIS、UTF-8では全く異なる三種類のファイルが存在し得るものだと思っておりました。しかしこれは私の理解が間違っていて、英数字であれば常にShift JISであり、マルチバイト文字があって初めてUTF-8なのかEUCなのかShift JISなのかが決定されるということなのでしょうか?

英数字のみのファイルでもUTF-8ファイルという前提を確認する方法はないのでしょうか?

宜しくお願いします。

投稿日時 - 2016-03-29 14:44:30

QNo.9150655

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.4

>test.txt: ASCII (CRLF)

これは、ファイルがASCIIコードだと言うことです。

Shift_JISやEUC-JPは、ASCIIに含まれない、日本語(JIS規格で定められた文字)をバイト列で表現するためのエンコード方法の名前です。
ASCIIコードは、文字コードが0~127(0x00~0x7F)のバイトだけからなります。Shift_JISやEUC-JPはこれに含まれない128~255(0x80~0xFF)の(一部の)バイトを使って日本語を表現します。
UTF-8も、ASCIIに含まれない文字を表現するときに128~255(0x80~0xFF)の一部を使います。

従って、ファイルに含まれるバイトがすべて0~127(0x00~0x7F)の時には、Shift_JISとかEUC-JPとかUTF-8とかが登場する余地がありません。

投稿日時 - 2016-03-30 23:10:32

ANo.3

アスキーコードはUTF-8でも同じコードにエンコードされるため、ファイルの内容としては全く同じになります。なので、アスキーコードでもあり、UTF-8でもあることになります。
常にファイルのエンコードをUTF-8として認識させたいのであれば、下記のようにBOMありのUTF-8に変換するという方法はあると思います。

nkf --overwrite --oc=UTF-8-BOM test.txt

投稿日時 - 2016-03-30 04:59:21

ANo.2

> test.txt: ASCII (CRLF)
> となります。このファイルは、Shift-JISだという判定だと思います。

いいえ、ASCII コードしか存在しないという判定です。
Shift-JIS ではありません。

テキストのみのファイルにはどの文字コードが使われているかと言う情報は書かれていませんので、マルチバイト文字が出てきてはじめて判定ができます。


> 英数字のみのファイルでもUTF-8ファイルという前提を確認する方法はないのでしょうか?

半角英数字は ASCII コード で表現されます。
UTF-8だろうがShift-JISだろうがEUCだろうが、半角英数字で使われるコードは全て ASCIIコード に準じているため、半角英数字しか使われていないデータは区別出来ませんので全て ASCIIコード と判定されるでしょう。

投稿日時 - 2016-03-29 15:40:52

ANo.1

UTF-8でもEUCでもShift JISでも,英数字のみでしたらまったく同じですから判別することはできません。
「test.txt: ASCII (CRLF)」というのはShift-JISだと判定されたわけではなく,ASCII文字で書かれていると判定されたのです。ASCII文字の部分はUTF-8でもEUCでもShift JISでも同じです。

投稿日時 - 2016-03-29 15:39:00

あなたにオススメの質問