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

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

ただいまの
回答率

90.40%

  • C++

    4638questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Qt

    211questions

    QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

[Qt]ファイルの文字コード判別

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 2,128

BeatStar

score 1386

趣味でC++やっています。
( Qtを使っています )

テキストファイルの文字コード( UTF-8, ANSI etc. ) を判別する方法はありますでしょうか?

前回の質問で一応ファイルの入出力に関しては何とかなったのですが、

GUIで QTextEdit ( Windows APIだと EDIT ) 等にD&D(ドラッグアンドドロップ)されたときにD&Dされたファイルを読み込んで
QTextEditに表示する...みたいな処理をするときに、前回の方法だと UTF-8か ANSIか...みたいなやつがわからないと無理で、
もしUTF-8と限定しても...なので

D&Dされた -> D&Dされたファイルの文字コードを判別 -> 適切な文字コードでファイルを読み込む -> QTextEdit等に出力etc.

のようにしたいのですが。

読み込み自体は 前回の方法で、(fgetws関数だったかな。)それで読み込んでいます。
QTextEdit等に出力したりするのは問題ありませんが、

問題は「文字コードをどうするか」( UTF-8, ANSI... をどうやって割り出すか ) です。

自分でも「Qt テキストファイル 文字コード 調べる」で検索してみましたが、単に読み込む・書き込む...っていうやつだけでした。
( 私が読んだ範囲では。 )

[情報]
言語: C++
コンパイラ: MinGW
Qt: 5.6
Windows API: あり
OS: Windows XP, 7, 10 ( WinAPIを使っているため )

もちろん、C言語由来でも、C++由来でも, Qtでも, WinAPIでもいいですが、とにかく判別ができないことには...

よろしくお願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+1

グーグルさんで、"文字コード 判定方法" ("方法"はグーグルさんがつけてくれた)としたら、文字コードを判別する なんてページがありました。

詳しくは、そちらを見て頂くとして、まずは、BOM判定からは、他の方の書かれている通りで、問題はその後ですね。結局は、ファイルの中身をスキャンするしか方法は無いと思います。Unicode(UTF-8, UTF-16,..)だけなら、そんなは難しくないと思います。まあ、Shift-JISを含めてもそれほどでは無いとおもいますが、対象範囲は、どれ位あるのでしょうか? Wikipedia を見ると、文字コード でいやになる位あります。

あと、Unicode以前の多くの文字コードは、MSB=0 の時、Asciiと同じ。(EBDIC 等例外はあるが) ので、多くの場合、判定は難しいです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/11 14:18

    ご回答ありがとうございます。
    なるほど。やはりUTF-8決めうちでやって、余裕ができれば...って形にします。

    キャンセル

checkベストアンサー

0

UTF-8決めうちにしてしまうのも手だと思います。BOMがないときは文字コードを確実に決定することは不可能なので(経験的手法は誤爆があり得る)。vscodeがやっているように、あとから文字コードを指定するくらいでいいんじゃないでしょうか。

いい加減Shift-JISは滅べ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/07 18:03

    ご回答ありがとうございます。
    やはりUTF-8決め打ちで、ユーザに任せたほうが無難ですかね。

    キャンセル

0

こんにちは。

WindowsではANSIコードをShift-JISコードの意味で使っている場所があるそうですが、これは誤りでANSIはASCIIのことですから、UTF-8と互換性があります。(入り混じっても問題ない。)
ですので、ASCIIとUTF-8だけであることが判っているならUTF-8指定すればOKです。

Shift-JISなどのファイルも混じっている場合は、経験的な手法で文字コードの推測を試みることになります。(BOMがついていれば確実ですが、Shift-JIS等にBOMはないです。)

Qtはどうも ICU を内蔵しているようです。
これを呼び出すことができれば、ICU の文字コード判定機能を使うのも一つと思います。(多くの場合、推測になるので誤判定もそれなりにある筈ですが、いかんともし難いです。)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/07 18:04

    ご回答ありがとうございます。
    やはりめんどくさいんですね...(手法が)
    時間があき次第、バイナリエディタかなんかでチェックしてみますね。

    キャンセル

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

  • ただいまの回答率 90.40%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • C++

    4638questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Qt

    211questions

    QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。