std::wifstream
の機能を完全に勘違いしてました。
ファイルからの読み出しをwchar_t単位で行うものと思ってたのです。
しかし、operator>>で読み出した時、デフォルトでは1char単位で読み出してました。1charを1wchar_tへ読み出しているのです。
また、コンソールに日本語をキレイに出力したいの「解決した方法」でaglkjgggさんが書かれている内容から、指定された文字コード変換を行ってwchar_tへ読み込んでいるようです。つまり、デフォルトの文字コード変換はASCII→UTF-16と思われます。
しかし、そのような機能であれば、std::ifstream
でoperator>>(wchar_t*)
等を実装した方が使い勝手が良いように感じます。
なぜ、現在のような仕様になっているのか、推測できる方いらっしゃいませんか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
ファイルからの読み出しをwchar_t単位で行うものと思ってたのです。
つまり、デフォルトの文字コード変換はASCII→UTF-16と思われます。
厳密にはASCIIコードではなく、ロケールに従ったエンコード方式(コードページ)でファイルを読み、ワイド文字(WindowsならUTF-16、LinuxならUTF-32)に変換するという仕様ですね。初期状態ではC/C++のロケールは"C"に設定されているのでASCIIコードとなります。
「テキストファイルをワイド文字で読み書きする」という機能を実現するなら、C++ではワイド文字の文字コードが規定されていないのでワイド文字を入出力に使うわけにはいきませんから、ロケールに従って変換する、という使い方は合理的だと思います。
ちなみに、C標準のsetlocale
関数ではC++ライブラリ側のロケールが設定されないので、std::locale::global
関数を使用する必要があります。
C++
1std::locale::global(std::locale(""));
「コンソールに日本語をキレイに出力したい」の方をちらっと見ましたが、setlocale
を使っているのが問題のような気がします(すでに解決済みですが)。
投稿2017/05/02 14:44
総合スコア5938
0
回答ではありません。すみません。
もやもやしたままですが、まずはとっかかりとして以下は参考になるのかなと思いました。
does (w)ifstream support different encodings
ざっと目を通したのですが、結局、以下の言葉に従うのもアリかなと思いました。
Pythonの設計哲学
環境に戦いを挑むな。そして流れに身を任せよ。
ここでは環境=標準入出力の接続先=シェル/ターミナルと解釈しました。
詳しい方の回答を待ちたいと思います。
投稿2017/05/02 13:21
総合スコア38266
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/02 14:01
2017/05/02 14:21
2017/05/02 14:42
2017/05/03 03:30
2017/05/03 03:58
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/02 15:34
2017/05/02 16:04
2017/05/02 18:00
2017/05/03 01:14
2017/05/03 04:07 編集
2017/05/03 04:07
2017/05/03 04:28
2017/05/03 04:38
2017/05/03 06:36
2017/05/08 06:48 編集
2017/05/08 10:04