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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C++

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

Q&A

解決済

4回答

3737閲覧

c++でのファイルの読み込み時に、もしShift-JISだったらUTF-8に変換して読み込む方法はありますか?

kanka

総合スコア26

C++

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

0グッド

0クリップ

投稿2018/10/29 13:15

編集2018/10/29 14:18

C++

1ifsteram ifs("test.txt");

にてファイルを読み込む際に、Shift-JISの文章を読み込もうとすると後々にバグが起きて止まります。(mac環境だからなのかもしれませんが... windowsでも同じなのかも教えていただきたいです)
もしShift-JISのファイルを読み込んでしまった時に、その判定をしてUTF-8に変換することはできますか?
もしくは、判定だけしてエラーメッセージを返すだけでも良いです。
よろしくお願いします。

バグが起こる内容

c++

1#include <iostream> 2#include <fstream> 3#include <sstream> 4#include <iterator> 5#include <string> 6 7using namespace std; 8 9int main(void){ 10 char filepath[1000]; 11 cout<<"ファイルを入力してください\n"; 12 cin>>filepath; 13 ifstream ifs(filepath); 14 if(!ifs){ 15 cerr<<"ファイルの読み込みに失敗しました。名前があっているか確認してください。"<<endl; 16 exit(1); 17 } 18} 19

ここで、windowsで作ったShift-JIS形式のファイルを読み込もうとすると失敗します。(Xcodeを使ってます。)

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

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

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

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

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

ikadzuchi

2018/10/29 14:00 編集

バグが起きるコードと、バグの内容を書いてください。
guest

回答4

0

ベストアンサー

ICUというライブラリを使うか
BOM付きUTF-8のみ対応していればいいのならば頭にBOM(0xEF 0xBB 0xBF)があるかを判別する事が可能

投稿2018/10/29 13:35

asm

総合スコア15147

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

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

kanka

2018/12/26 10:25

ICUでうまくいきました。ありがとうございます!
guest

0

一旦、UTF-8で読み込んだら、Shift-JISと見なして、変換するのは大変かと。
方法としては、以下のどちらかかなと思います。

  1. まずはバイト列として読込み、UTF-8 か、Shift-JISかの判定を行い、文字列への変換を行う。

  2. 一旦、UTF-8 として読込み、NGだったら、Shift-JISとして読み込む。
    --> Shit-JISをUTF-8 として読み込んだ時、どうなるのよく分からない。

  3. のバイト列して読み込む場合、UTF-8のコードはクセ(ルール)があるので、それに反した場合、Shit-JISと見なす。 または、Shift-JISと見なした場合、Shift-JISに含まれない、バイト列があった場合、UTF-8 と見なすことになると思います。

具体的方法については、さっと書けるほど、覚えていないので、必要なら、、。

投稿2018/11/01 14:00

pepperleaf

総合スコア6383

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

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

0

BOMがないbyte列の文字エンコード同定は推定はできても確実に決定する方法はないので、UTF-8 with BOMしか受け付けない、としてしまうのが良いと思います。UTF-8 with BOMならWindowsでも大抵のエディタで適切に扱える。

投稿2018/10/29 16:54

yumetodo

総合スコア5850

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

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

0

Windowsの場合、というか、C言語系では文字列と言ってもしょせんはバイト列なんで、それでエラーが出て止まるってことはありません。

コード変換に関しては、
「c言語 utf8 sjis 変換」でぐぐるといくつかでてきますね

投稿2018/10/29 13:29

y_waiwai

総合スコア87749

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問