UTF-8のファイル読み込みについての問題

このQ&Aのポイント
  • UNICODEの場合は正しく読み込めるが、UTF-8の場合は読み込めない。
  • ファイルの文字コードをUTF-8に設定しているが、正しく読み込めない。
  • 開発環境はXP、Visual C++ 2010 Express。
回答を見る
  • ベストアンサー

ファイル読み込みについて

ファイル読み込みについてなのですが、 文字コードがUNICODEの場合は出来たのですが、 UTF-8の場合、正しく読み込めないようなのですが、 何か原因があるのでしょうか? ちなみに、読み込むファイルの文字コードはUTF-8にしています。 _wfopen_s(&fp, file_name, L"rt,ccs=UTF-8")でファイルを開いて、 fgetwcで読み込んでいるのですが、正しく読み込めません。 ちなみに、アクセス許可の種類をL"r"にしたら読み込めました。 原因(これが原因かもしれないでも構いません)とどのようにすればいいかを 教えて頂ければと思っています。 開発環境は、XP、Visual C++ 2010 Expressです。

noname#154655
noname#154655

質問者が選んだベストアンサー

  • ベストアンサー
  • sygh
  • ベストアンサー率76% (42/55)
回答No.1

こんな感じで r でも rt でも普通に読み込めていますが…… そもそも _set_fmode() を明示的に呼び出さない限り、既定で r モードと rt モードは同じのはず。 // .cpp 拡張子で保存して C++ モードでコンパイルしてください。 #include <cstdio> #include <locale> #include <conio.h> void main() { _wsetlocale(LC_ALL, L""); FILE* fp = NULL; #if 1 // BOM 無し UTF-8 const errno_t er = _wfopen_s(&fp, L"utf8_test.txt", L"rt,ccs=utf-8"); #else // BOM 付き(先頭に+3バイト) const errno_t er = _wfopen_s(&fp, L"utf8_bom_test.txt", L"rt,ccs=utf-8"); #endif if (er == 0 && fp) { wint_t ch = 0; while (WEOF != (ch = fgetwc(fp))) { putwchar(ch); } fclose(fp); } _putws(L"Press any key to exit..."); _getch(); } ・テキスト ファイル作成に使用したソフト(テキスト エディタなど)は何ですか? ・テキスト ファイルは UTF-8 フォーマットで正しく保存されていますか? ・テキスト ファイルの内容はどのようなものですか? ・0x0D (CR) のような制御コードが混ざっていませんか? 開示されている情報が少ないと、回答者も推測しづらいです。

noname#154655
質問者

お礼

回答ありがとうございます。 出来ました。 原因は、文字コード変換ソフトでした。 Visual C++ 2010で作成したソースコードのファイルをUnicodeやUTF-8などに ソフトを使って変換していたのですが、そのソフトに原因があったようです。 メモ帳でUTF-8に保存し直してから試してみたらうまくいきました。 Unicodeで問題なかったのでUTF-8でも問題ないだろうと思ってしまいました。 でも、エディタ(サクラエディタ)では問題なく開けているので、 少し疑問が残りますが。 一応多くのファイルで試しておきたかったのですが、 1つ1つのファイルをUTF-8などに保存し直すのは時間がかかるので、 変換ソフトを使いました。 rモードとrtモードは_set_fmode()を呼び出さない限り意味が無いんですね。 ネットで色々調べていたらrtと書いてあるサイトもあったので、 rモードとrtモードどちらも試していて、rtモードで試している時に 質問させて頂いたのでrtのままでした。 まだ、細かい確認はしていないのですが、今の所ちゃんと読み込めているので、 一応締め切らせて頂きました。 回答ありがとうございました。

関連するQ&A

  • UNICODE時のファイル入出力について

    【使用環境】 WinXP, VS2005, C++, "Unicode 文字セットを使用する"設定 現在以下のようなコードを試しているのですが、何故か上手くいきません。 マルチバイトの際にWCHARをcharに置き換えたりした場合はちゃんと 動作したのに何故でしょう・・・。 ヘルプから探してみると、ロケールの設定らしきことが書いてありますが、 サンプルが見つからず苦戦しております。 以下のコードをどのように修正すれば正しく読み込めるようになるのでしょうか・・。 --- コード ------------------------------------------------- #include <iostream> #include <cstdio> #include <cstdlib> #include <windows.h> using namespace std; // 1行読み込んで返す関数 WCHAR * LoadFile( WCHAR * FilePath ){  static WCHAR Buf[ 256 ] ={0};  FILE * fp = _wfopen( FilePath, L"r" );  fgetws( Buf, 256, fp );  fclose( fp );  return Buf; } int main(){  WCHAR * text = LoadFile( L"test.txt" );  cout << text; } --- 読み込むファイルの中身の文字列:test.txt --------------- aあ --- 実行結果 ----------------------------------------------- 00417178続行するには何かキーを押してください . . .

  • 【PHP】ファイル読み込みで「見えない文字」が発生する??

    PHP初心者です。 不思議な現象を経験したため質問させていただきます。 ファイルから文字列を読むとき、どうしても先頭に「見えない」文字がついてしまいます。見えない文字とは空白ではなく容積ゼロの文字のことで一種の文字化けと思われます。 <PHPプログラム> <?php header('Content-Type: text/html; charset=UTF-8'); header('Content-Language: ja'); mb_internal_encoding("UTF-8"); mb_regex_encoding("UTF-8"); print "ここに発生→"; if($fp = @fopen("file.txt", "r")){ while( !feof($fp) ){ $line = trim(fgets($fp)); print "$line"; } @fclose($fp); } ?> <データファイルfile.txt の中身> ←ここ!1行目 2行目 3行目 <出力結果> ここに発生→←ここ!1行目2行目3行目 出力結果にカーソルを持って行き、矢印キーで動かしていただければ → と ← の間でカーソルが1回動かず、何かが「存在」していることが確認できると思います。 このような文字は初めての経験でわけがわかりません。予防策がありましたらお願いいたします。 <環境> レンタルサーバーはPHP4.4.4(UTF-8) ローカルはWin-XP(3台で確認) プログラムもデータファイルもUTF-8で書いています。 <ほか> その文字自体をここに載せようとしましたが「」に変換されてしまいました。これは一体何でしょう??

    • ベストアンサー
    • PHP
  • unicodeファイルの読み込み

    javaアプレット上で BufferedReader file = new BufferedReader(new FileReader("C:/test/list.txt")); で外部テキストファイルを読み込んでいるのですが、この外部テキストファイルの文字コードをANSIからUnicodeに変えるとプログラムが動かなくなります。日本語やアルファベットではない文字の保存のためにテキストをUnicodeにて保存しなければならないのですが、どうすればUnicodeのテキストファイルを読み込むことができますか。

    • ベストアンサー
    • Java
  • VC++でUTF-8のファイルを出力したい

    VisualStudio2005で以下のコードを実行したとき、ファイルをUTF-8で作成したいのですが、なにか方法がありますか? 現状では、SJISで出力されてしまいます。 ソースは、『ファイル』-『保存オプションの詳細設定』で『UTF-8(BOM付き)』にしてあります。 #include <stdio.h> int main(int argc, char* argv[]) {     FILE *fp;     fp = fopen( "c:/temp/log.txt", "w");     fprintf( fp, "%s\n", "あいうえお" );     fclose( fp );     return 0; } ちなみに、”あいうえお”の部分を(EmEditorで)SJISに無くてUTF-8にだけ存在する文字にした場合、VisualStudioのエディタ上では正しく文字が表示されます。 したがって、VisualStudio内ではリテラルの文字コードはUTF-8で扱われていると考えられます。・・・が、上記プログラムで出力すると文字化けします。つまり、SJISで出力されてしまいます。 ご教授のほど、よろしくお願いいたします。

  • VC++で日本語(マルチバイト)ファイルの読み込み

    VC++で日本語(マルチバイト)の文字が含まれているファイルを読み込もうと思っています。 例えばunicodeのファイルとして下記の内容があるとして、 11111 abcdef いろはにほへと このファイルから1文字ずつ読み込みたいのですが、ヘルプで調べたところfgetwc関数でマルチバイトの読み込みができるということを調べました。 ファイルのオープンは_wfopenを使用しているのですが、テキストモード・バイナリモードでどちらで開いても、fgetwc関数の戻りはファイルを1byte読んだ結果を返します。 半角文字の場合は"1"とか"a"を単純に呼んで、マルチバイト文字であれは"い"とか"ろ"というデータを読み込みたいのですが、どうすればいいでしょうか?

  • visual studio2010 文字コード

    visual studio2010を使っています。Cのプログラムを書いてます。 文字セットを選ぶ箇所で ・マルチバイト文字セットを使用する ・Unicode文字セットを使用する という2つの選択肢がありますが、 上を選ぶとshift-jisの文字コードが選ばれると認識してます。 それで、下のUnicode文字セットを使用するを選んだ場合なんですが、 これはutf-16のことですか? utf-8が主流だと思っていたのでここでさすUnicodeが勝手に utf-8のことだと思ってたんですが、 visual studioで扱っている方はワイド文字で、 utf-8について調べたらASCIIにも対応できる可変長のマルチバイト という風に書いてあったので、あれ?と思い色々調べたら ウィンドウズではメモ帳などでUnicodeという表記でutf-16を指すみたいなので これも同じでutf-16なのかなと思いました。 ただ、visual studioで扱うUnicodeはワイド文字ということと、 utf-16は2バイト固定ではなく2バイト単位なだけで 4バイトで1文字を表すこともあることが書いてあったので、 これはワイド文字とは違う??と混乱してます。 それともワイド文字は2バイト固定と思ってたんですが wchar_tが2バイトずつなだけでワイド文字は1文字2バイトというわけではない ということでしょうか? それとwchar_tで2個分で1文字を表したりする使い方はするんでしょうか? まとまりのない質問になってしまいましたがよろしくおねがいします。

  • MFCで、UTF-8で保存したい

    すいません。 またまた教えて下さい。 MFCで、UTF-8でファイルを保存しようとしていますが、うまくいきません。 下記のプログラムで、添付のエラーが出ます。 // UTF-8ファイル書き込み FILE* pFile1; fopen_s(&pFile1,"C:\\app\\8a.txt", "w, ccs=UTF-8"); //fopen_s(&pFile1,"C:\\app\\8a.txt", "w"); //UTF-8でないのでOK if (pFile1) { CStdioFile file(pFile1); file.WriteString(_T("abcあいうえお")); file.Close(); } <環境> windows8 visual studio2012(2008でも同じでした) MFCで、文字セットはマルチバイト文字セットを使用するにしています。 参考にしたHP http://faithandbrave.hateblo.jp/entry/20080724/1216890457 なぜでしょうか? よろしくお願い致します。

  • メモ帳で保存した日本語テキストや日本語XMLをJavaで読込、保存。メモ帳での保存文字コードはなにが推奨されるでしょうか?

     Windows9x系ではないWindowsVistaやXP、NT、2000のメモ帳(Unicodeのbig endianは保存できるがおそらくUnicodeのbig endianでのBOMなし保存不可。UTF-8は保存できるがUTF-8でのBOMなし(UTF-8N)の保存不可。Unicodeのlittle endianは保存できるが仕様なので言うまでもないがUnicodeのlittle endianでのBOMなし保存不可。)で保存した日本語テキストや日本語XMLをJavaで読込、保存。メモ帳での保存文字コードはなにが推奨されるでしょうか? やはりJavaのString型に近いUnicode big endianがよいのでしょうか? それともJava側で自動認識してくれるのでしょうか? XMLの場合は1行目でそのXMLファイルが使用している文字コードが何か宣言しますよね。 でもテキストファイルだと文字コードを宣言する場所がないみたいですし・・・(ここでの文字コードを宣言する場所としてはBOMは例外ですよ 念のため) 補足:メモ帳だとUnicode big endianで保存すると必ずBOMが付くみたいです。 メモ帳はLF改行が使えません。CR+LF改行のみ対応です。

    • ベストアンサー
    • Java
  • 日本語ファイル名のFTPについて

    お世話になります。 日本語ファイル名のFTPを行っているのですが、ファイル名が文字化けして困っております。 解決策をご存知の方が、いらっしゃいましたら解決するための情報を頂けますでしょうか。 私が、使用しているのは、以下の環境となります。 【サーバ環境(FTP元、FTP先ともに同様となります。】 centOS5.5. jdk1.6 ftpを行う際、以下のようにして文字コード、転送モードを指定しております。 fp.setFileType(FTPClient.BINARY_FILE_TYPE); fp.setControlEncoding("UTF-8"); // ファイル送信 is = new FileInputStream(clientFilePath);// クライアント側 fp.storeFile(putFilePath, is);// サーバー側 String putFileNm = new File(putFilePath).getName(); String parentPath = new File(putFilePath).getParent(); String[] flist = fp.listNames(parentPath); for(int i=0; i<flist.length; i++) { if(putFileNm.equals(new File(flist[i]).getName())){ return true; } } FTP元、FTP先のサーバの文字コードも echo $LANGで確認しましたが、両方とも「ja_JP.UTF-8」になっております。 お手数お掛け致しますが、ご教授の程よろしくお願い致します。 以上、よろしくお願い致します。

    • ベストアンサー
    • Java
  • csv形式のデータの読み込み

    csv.txt(unicode形式で保存し、ffftpでバイナリ転送モードでアップロード) =================================================================== J-0001,亜,1 J-0002,哀,2 J-0003,愛,3 J-0004,悪,4 =================================================================== のデータを、phpで読み込み、ブラウザに表示できません。 以下がソースです。いろいろ検索したり調べたりみたのですが、 だめでした。phpのヘッダーは「charset=utf-8」です。 ファイルを開いたときなのかわからないのですが、 文字化け?が起きているように思えます。 文字コードがおそらく原因だと思うんですが、行き詰まりました。 phpソース =================================================================== $data_txt = "csv.txt"; $fp = fopen($data_txt, "r"); if ($fp == false) { printf("data.txtを開けませんでした。"); return; } $count = 0; while (!feof($fp)) { $strs[$count] = fgets($fp); $strs[$count] = split(",", $strs[$count]); $count++; } printf($strs[0][1]); printf($strs[1][1]); printf($strs[2][1]); printf($strs[3][1]); =================================================================== 表示させたい実行結果 ===================== 亜哀愛悪 =====================

    • ベストアンサー
    • PHP

専門家に質問してみよう