• 締切済み

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

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

みんなの回答

  • mcWalker
  • ベストアンサー率69% (27/39)
回答No.3

SJIS文字コード表はありませんか。 SJIS文字の第1バイトは、0x81 - 0x9F または、0xE0 - 0xFC, 第2バイトは、0x40 - 0x7E または、0x80 - 0xFC です。 因みに、半角カタカナは、0xA1 - 0xDF です。 残りは、ASCII で、ANSI の判定関数があります。 方眼紙に第1バイトと第2バイトを縦横に書いて、塗りつぶし 見てください。 尚、読みこんだ1バイトが int に格納される場合、一旦 0xFF でマスクして、上記の定数と比較すると安心です。 また、SJIS <-> unicode 変換の API がありますので、 MSDN などで確認されるとよろしいかと思います。

全文を見る
すると、全ての回答が全文表示されます。
回答No.2

> では、SJISとかだとマルチバイトなので、半角文字は1byte、全角文字は2byteだと思うので、そのような場合はどうすればいいのでしょうか? まず1byte読めば、それが'半角'か'全角の前半分'かが判別できるはず。後者なら残る1byteを読めばいい。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

UNICODEで書かれたテキスト・ファイルであれば、 半角/全角にかかわらずどれも1-word(2byte)なので なにも考えずに2byteずつ読めばいいはず。

osakana-manbou
質問者

補足

たしかにunicodeなら半角文字もすべて2byteで表現するため、そのまま2byte単位で読み込めばいいですね。 では、SJISとかだとマルチバイトなので、半角文字は1byte、全角文字は2byteだと思うので、そのような場合はどうすればいいのでしょうか?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VC++ マルチバイト文字とUniCode文字??

    VC++のプロジェクトプロパティには文字セット指定があります 『マルチバイト文字セット』『UniCode文字セット』の2者が選択出来ますが、これらの選択の優劣は何処にありますか? この選択の適否が分からない私は参考にしているサンプルがマルチバイトである時にはマルチバイトを、またUniCodeで書かれたサンプルを見ている際にはUniCodeを指定しており、恥ずかしいかぎりです 選択の判断基準を如何すれば良いのかご指導をお願い申し上げます 更に恥ずかしい質問】なぜC#には文字セット指定が見当たらないのでしようか???

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

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

  • ファイルの入出力でのテキスト モードでの変換について

    今までとりあえずサクサク骨組み作りたいので、短くかけるためマルチバイト文字主体で来たのですが ここらへんでUnicode文字のことが気になってきたので、以下のような関数を基本にしてプロパティやコードをいじったりしつつ入出力を色々試してみたのですが… (エラー時の処理とか省略します。) #include <TCHAR.h> #include <stdio.h> #include <locale.h> #ifdef _UNICODE #define 文字セット "Unicodeを使用" #else #define 文字セット "マルチバイトを使用" #endif void f(){ _tsetlocale(LC_ALL, _T("japanese")); FILE *fp; if ( _tfopen_s( &fp, _T("exp.txt"), _T("wb") ) ) return; _ftprintf( fp ,_T(文字セット)); fclose(fp); } ファイルサイズや出力内容を見てみると、Unicode文字を使う場合、このようにバイナリモードで書き込みをすると、バイト数が、単純にsizeof(wchar_t)*文字数になってしまうようで 気になったので調べてみると、こういうことみたいですね。 http://msdn.microsoft.com/ja-jp/library/c4cy2b8e%28VS.80%29.aspx 最後の方に >Unicode ストリーム入出力関数をバイナリ モードで実行すると、ファイルが Unicode であると想定されるため、入出力時に CR-LF 変換も文字変換も行われません。 と書いてありますが これは、ただしつまり Unicodeを扱う場合でも、結局バイナリモードで出力したらバイナリモードで入力すれば正しい同じデータが得られるし、テキストモードで出力したらテキストモードで入力すれば大丈夫と考えて良いですよね? 言い換えれば、少なくともUnicodeでテキストモードだと、CR-LF 変換と文字変換が行われてしまうということで (少なくともマルチバイトなら文字変換はなしでしょうが) 「文字変換」については今回初めて知りました。 他にはマルチバイト・Unicode問わず、テキストモードを使用すると、何か変換が行われる可能性はあるのでしょうか?

  • 日本語(マルチバイト)でのwordwrap処理

    簡易メーラーのようなものを作っており、返信の際に改行と”>”が入る処理をしたいと思っています。 しかし、wordwrapを使って分割しようとすると、文字列の途中に半角文字が奇数個入っている場合、その後の文字が化けてしまいます。 mb_splitという関数がありますが、これはまだ実験段階ということなので、今の時点での利用は避けたいと思っています。他のマルチバイト関数を一通り見てみましたが、mb_split以外にwordwrapのような機能は無いように見えました。 どのようにすれば日本語で自動改行処理ができますでしょうか。ご教授下さい。宜しくお願いします。

    • ベストアンサー
    • PHP
  • マルチバイトと英語版Windows7

    VS2005 で MFC を使いながらエディターを作ったりしています。 プロジェクトファイルの設定で、 マルチバイト文字セットを使用する とした場合、日本語のWin7では、うまく表示できますが、 この作成されたソフトを、英語版のWin7の上で動かした場合、 文字はきちんと表示されるのでしょうか? Unicode文字セットを使用する にして、作り直さないと、英語版のWin7ではうまく動かないのでしょうか? よろしく、お願いします。

  • VC++ ファイル読み込み

    VC++についてお教えください。 コンストラクタでテキストファイルの中身をメモリへ読み込みたいのでですが、どのようにしたらよいのか解りません。 お教え願います。 ファイルの中身は4バイトの数値データで、 数十行あります。 ある文字列を検索しながら、その文字列が存在したら、 数ワードを読み込むことを考えています。 Cfileを使用するのか、ファイルのハンドルを設定するのか、 右も左も解らない状態です。 よろしくお願いします。

  • VB(VBA)で、バイナリデータを使ってテキストファイルを作成したいの

    VB(VBA)で、バイナリデータを使ってテキストファイルを作成したいのですが、 例えば、"A"が一文字のみのShift-JIS もしくはunicodeのテキストファイルを作るため、 (下記の確認はShift-jis で行っています。) Dim ByteData As Byte ByteData = AscW("A") Open "C:\A.txt" For Binary Access Write As #1 Put #1, 1, ByteData Close #1 としました。 できあがったファイルをバイナリエディタで確認すると、  41 となっています。 (Unicode は 41 00 2バイト文字でリトルエンディアンのため) この41は、"A" の文字コード(Shift-JIS)「65」の16進表記です。 この「41」という値を使ってバイナリモードでテキストファイルを作成したいのですが、 どのようにすればよいでしょうか? 上記 Put #1, 1, ByteData の部分を、 1.Put #1, 1, 41 としたところ、通常表示はできないファイルができあがったみたいです。 バイナリモードで 「29 00 20 20」でした。 文字コード00 に該当する文字がないためだと思います。 2.Put #1, 1, "41" としたところ、「41 」(バイナリモードで 「34 31 20 20」) (41の後ろは半角空白) で×でした。 3.Put #1, 1, CLng("&H" & 41) としたところ、通常表示はできないファイルができあがったみたいです。 バイナリモードで 「41 00 00 00」でした。 4.ByteData = CLng("&H" & 41) Put #1, 1, ByteData これでやっとできました。 この他にも方法があるのか?と思い、質問させていただきました。 ご指導よろしくお願いいたします。

  • マルチバイト関数の呼び出し方

    WindowsXP上でApache2.0.54とPHP5.0.4を使ってPHPのテストサーバを立てたのですが、マルチバイト関数をまったく読み込んでくれません。 PHPのコアファイルなどを "C:\Program Files\" 以下に "PHP 5.0.4" と言うフォルダをつくり、そこに保存してあります。Apacheの設定ファイルでPHPのモジュールをそのフォルダから呼び出して、うまくPHPが動作しました。また、PHP.ini上でextensionを "C:\Program Files\PHP 5.0.4\ext\" から読み出すようにしました。もちろん、extension一覧にあるphp_mbstrings.dllのコメントははずしてあります。 どのようにしたら、マルチバイト関数を呼び出せますか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPマルチバイト文字列関数

    FedoraCore4のPHP-version5.0.4 rpmをインストールしたのですが、マルチバイト文字関数が標準になっていないのでマルチバイト文字関数が使えるようにしたいのです。 今のところ一度PHPをアンインストールして、ソースを落としてきて、configureの時にオプションで指定して対応しようかと考えています。 しかし、超初心者ですのでもう少し簡単な方法を探しています。ご存知の方はぜひご教授いただきたいと思います。 よろしくお願いいたします。

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

    いつもお世話になっています。 早速質問なのですが、VBのファイル処理において固定長データのテキストファイル読み込みの処理で、 固定長データの改行コードがChr(10)になっているデータがあります。 下記のどのOpenステートメントを使用しても、1行読み込みではなく全行読み込まれてしまうのです。 ↓ファイルモード (1)Open strInFile For Input As #intInFile (2)Open strInFile For Random As #intInFile Len=文字数 (3)Open strInFile For Binary As #intInFile ちなみに読み込みのモードは ・Line Input ステートメント ・Get ステートメント の2つを使用してみました。 改行コードの種類に依存せずにデータを1行読み込む方法を教えていただきたいです。