プロが教える店舗&オフィスのセキュリティ対策術

現在WindowsXP,VC++2008,でXMLの変換プログラムを作っています。XMLのパーサはxerces3.0.1をビルドしました。
JAVAなら少々経験がありますが、C++は初めてです。
要望として、日本語以外のOSやLINUX類でもできるだけそのまま動かせるよう留意してほしいと言われたのですが、具体的にどうやって気をつければよいのか思案中です。

まず、テキストファイルを辞書として読み込むので、その文字コードとか問題になるのかなと思います。今はShift-jisで何の変換もなくUTF-8のXML変換ができていますが、xercesに変換関数があるからです(おそらく内部はUnicode)。LINUXにしたらeuc-jpだし、欧州だとまたちがうだろうから、どのように辞書を定義するのがよいのかわからなくて困っています。
文字コード変換ライブラリにICUというのがあるところまでは調べましたが、これをどう変換に活かせばos,言語環境に依存しにくいプログラムがつくれるのかよくわかりません。

あと、いろいろ検索していると、windows系でしか働かない関数やunix系のものとかもいろいろあるのですね。これら、どの関数が使えてどれがこっちでは使えないですとかの情報はどうやったら手に入るのでしょう?ひとつひとつの関数を検索するしかないでしょうか。

漠然とした疑問でほんとうに恐縮ですが、ご意見、参考サイトなどお持ちの方、どうぞ教えてください。

A 回答 (2件)

> 要望として、日本語以外のOSやLINUX類でもできるだけそのまま動かせるよう留意してほしいと言われたのですが、具体的にどうやって気をつければよいのか思案中です。



どんなプログラムなのかにもよりますが、GUIやネットワーク周りは、OSごとに書き直すか、それなりのライブラリを使う必要があります。
CUIであれば、標準入出力の文字コードに気をつけるぐらいでしょうか?

> LINUXにしたらeuc-jpだし、欧州だとまたちがうだろうから、どのように辞書を定義するのがよいのかわからなくて困っています。

これはOSの問題ではありませんね。
XMLがどんな文字コードになっているかは、OSとは関係なく決まりますので、Windowsであっても一通りに対応する必要があるかと思います。

> あと、いろいろ検索していると、windows系でしか働かない関数やunix系のものとかもいろいろあるのですね。これら、どの関数が使えてどれがこっちでは使えないですとかの情報はどうやったら手に入るのでしょう?

移植性に配慮するなら、原則は標準ライブラリだけを使うようにしてください。
標準ライブラリ以外を使う場合、処理系の独自拡張ではなく、Boost C++ Librariesやその他のマルチプラットフォームに対応したライブラリを使うことをお勧めします。

この回答への補足

>どんなプログラムなのかにもよりますが
失礼しました。完全にCUIです。ただし、標準入出力はデバッグ以外ではつかわず、ログファイルを残します。

入力・出力対象のXMLはUTF-8なんですが、変換のための辞書情報をもつテキストファイルもUTF-8にすると、当然ながら文字化けするので、当面sjisにしているんです。当たり前にに入力ストリームから読んでくれるのがsjisになっているのはWindowsだからかと思いまして。。
ひょっとしてlocaleとか関係するでしょうか。今locale関連の文章を読んでるところです。

>標準ライブラリ以外を使う場合
再質問になってすみませんが、たとえばstat関数とかはOS依存なのか、とか調べる方法はありますか?

補足日時:2009/07/15 08:12
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
説明不足だったのに親切にいろいろ書いてくださって、感謝しています。標準ライブラリとはstdですね。(←多分)
Boostというのはちらっとしかみたことないのですが、何ができるのか調べてみようと思います。

お礼日時:2009/07/15 08:12

> 入力・出力対象のXMLはUTF-8なんですが、変換のための辞書情報をもつテキストファイルもUTF-8にすると、当然ながら文字化けするので、当面sjisにしているんです。

当たり前にに入力ストリームから読んでくれるのがsjisになっているのは Windowsだからかと思いまして。。
> ひょっとしてlocaleとか関係するでしょうか。今locale関連の文章を読んでるところです。

なるほど。localeでどうにかなる話ではありますが、対象とする処理系を限定しないと大変ですよ。
一応アドバイスしておくと、codecvtファセットを適切に定義すれば、どんな文字コードでも対応できるはずです。

> たとえばstat関数とかはOS依存なのか、とか調べる方法はありますか?

statは処理系に依存します。
ドキュメントを読めば、準拠規格や移植性に関する情報が含まれている場合がありますので、それを参考にしてください。
最も確実な方法は、C++の規格書を見て、そこで規定されているかどうかを調べるのが一番確実です。

> 標準ライブラリとはstdですね。

厳密なことはともかく、おおむねその理解で大丈夫です。
    • good
    • 0
この回答へのお礼

再度の回答、ほんとうにありがとうございます!

>対象とする処理系を限定しないと大変ですよ
下手にglobalでlocale指定しないほうがいいという意味でしょうか。
ソースも含めて全部UTF-8にしちゃおうかとか考えてますが、危険・・?

>codecvtファセットを適切に定義すれば
Boostにもありましたね。utf8_codecvt_facetというのが。
これを使うか、codecvtファセットを自分でなんとかするか、
ja_JP.UTF-8をロケール名に指定するか。でできるかと。
ただし最後のはうまくいったという情報は得られませんでした。

UTF-8で読めたとしても、辞書からロードした内容をxercesのオブジェクトにつっこむときにUTF-8が悪さする可能性があるので、明日手元に環境がそろったら、実験してみます。

お礼日時:2009/07/15 09:29

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!