DOBON.NET DOBON.NETプログラミング掲示板過去ログ

C言語でエンコーディングでファイルの読み込み

分類:[その他]

C言語でSystem.IO.StreamReaderのようにエンコーディング付きで
テキストファイルを読みたいですが、なにか良い方法ないでしょうか?
まさか、自力で変換なんてことには。。。
C言語の標準ライブラリに限らず
どんな情報でも結構です。よろしくお願いします。
■No12519に返信(CreateWindowさんの記事)
> C言語でSystem.IO.StreamReaderのようにエンコーディング付きで
> テキストファイルを読みたいですが、なにか良い方法ないでしょうか?
> まさか、自力で変換なんてことには。。。
> C言語の標準ライブラリに限らず
> どんな情報でも結構です。よろしくお願いします。
NKFとかかなぁ…
2005/08/31(Wed) 01:22:41 編集(投稿者)
2005/08/31(Wed) 01:09:00 編集(投稿者)
2005/08/31(Wed) 01:05:11 編集(投稿者)

> C言語の標準ライブラリに限らず
> どんな情報でも結構です。よろしくお願いします。
Win32APIのWideCharToMultiByteとMultiByteToWideCharを調べてください。

WindowsならばShift-JISコード(またはUnicode)で保存されたファイルなら普通に読み込めます。
Blueさん、いつもお世話になっております。
ありがとうございます。

> NKFとかかなぁ…

調べてみたいと思います。

> Win32APIのWideCharToMultiByteとMultiByteToWideCharを調べてください。

この関数は全角、半角変換しか印象になかったですが、
なんかできそうな感じもしますね。また報告します。

> WindowsならばShift-JISコード(またはUnicode)で保存されたファイルなら普通に読み込めます。

あ、これは、たとえば、EUCで保存されたファイルを読めないということでしょうか?
■No12531に返信(CreateWindowさんの記事)
>>Win32APIのWideCharToMultiByteとMultiByteToWideCharを調べてください。
>
> この関数は全角、半角変換しか印象になかったですが、
> なんかできそうな感じもしますね。また報告します。
全角<->半角の変換するAPIはLCMapStringです。
ぐぐればどんな関数かすぐわかると思います。>WideCharToMultiByte,MultiByteToWideChar

> あ、これは、たとえば、EUCで保存されたファイルを読めないということでしょうか?
そうですね。EUCはWideCharToMultiByte,MultiByteToWideCharに対応していないと思うので、自作でつくるのかな。
SJIS<->EUCならばそんなに難しくはないです。


質問に関係ないですが、この掲示板が.NET関連のため、C++の有識者の書き込みが少なく感じます。
(他の掲示板を勧めるのは失礼になりますが、)
一度、C++専用の掲示板をご利用したほうがよいかもしれません。
> あ、これは、たとえば、EUCで保存されたファイルを読めないということでしょうか?

なんか勘違いした気がします。
Shift-JIS、またはUnicode のファイルなら変換がなくても読めるって
ことですよね?
変換できないって思い込んでました。
■No12534に返信(CreateWindowさんの記事)
>>あ、これは、たとえば、EUCで保存されたファイルを読めないということでしょうか?
>
> なんか勘違いした気がします。
> Shift-JIS、またはUnicode のファイルなら変換がなくても読めるって
> ことですよね?
> 変換できないって思い込んでました。
>
>

あ、なんか、さらに、勘違い。。。

> 一度、C++専用の掲示板をご利用したほうがよいかもしれません。

了解しました。
解決済み!
> EUCはWideCharToMultiByte,MultiByteToWideCharに対応していないと思うので
これ嘘っぽいですね。。。
<msdn>
CodePage
変換に使うコードページを指定します。システムにインストールされている
コードページまたはシステムで利用できるコードページの値を指定することが
できます。
</msdn>
対応していたとしても、EUC→Unicode→SJISと変換しないといけないので、
私だったら、自作しますね。
stdio.h な命令で直接読むことはできないと思いますが、
取得したEUC-JPバイナリを、APIでShift_JIS/Unicodeの
文字列に変換(あるいはその逆)する事は可能だと思います。

たとえば、こんな感じで。

ret = ConvertINetString(Mode, 51932, 932, EUCバイナリ, EUC長, SJIS用バッファ, バッファ長);

その他、関連しそうな API としては、
 ConvertINetUnicodeToMultiByte
 ConvertINetMultiByteToUnicode
 WideCharToMultiByte
 MultiByteToWideChar
とか。
>>EUCはWideCharToMultiByte,MultiByteToWideCharに対応していないと思うので
> これ嘘っぽいですね。。。

言語サポートの追加状況によって、euc-jpC を Unicode に変換できたりできなかったりします。
デフォルト構成のままだと変換に失敗したはずです。

IE5.5 以上が必要になりますが、mlang APIs の ConvertINetXXX() を使用すれば、安定して euc-jp, iso-2022jp, shift_jis, Unicode を扱うことができます。
> ConvertINetString
こんな便利なAPIがあったとは。。。
# LoadLibrayがちとうざったいけど。

勉強になりました。
> # LoadLibrayがちとうざったいけど。

ConvertINetString() のヘルプにもチラっと書かれていますが、mlang 系の API は COM ベースでも公開されているので、LoadLibrary が面倒ならそっちを使うという手もあります。

DOBON.NET | プログラミング道 | プログラミング掲示板