みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C++のコンソールアプリケーションと文字コード

バッチファイルの処理を使って、様々な言語(中国語やキリル文字)や、あまりファイル名としては見られないような(^や%など)記号が含まれるファイルやフォルダについて

検索や、リネーム処理をするバッチファイルを作っていたのですが

どうも上記のような、記号を含む文字や、キリル文字を含むフォルダ名ファイル名、また長すぎるパスが存在するとうまく動きません

おそらくコマンドプロンプトがShift_JISしか扱えないのと、%に関しては変数の展開が関係していると思うのですが…

そこで、この機会にC++のコマンドラインによる実行でそういう例外的な文字列の時も対応してファイル操作ができる
プログラムを組みたいと思うのですが

何分無知で申し訳ないのですが

C++もコマンドプロンプト上で動く以上、Shift_JISに起因する問題に対処できず、バッチファイルの処理と同じように特殊な文字で
動作が不安定になってしまったりするのでしょうか?教えて下さい

Visual Express をインストールして、Windows アプリケーションについて多少調べて、その内部で特殊文字(Shift_JISに出ない文字や記号)の代入と出力
を試してみたところ、うまくいくようなので、もしコンソールアプリケーションで出来ないのであればWindowsアプリケーションの勉強をしようと思っています

また、Visual ExpressでC++のプログラムを組む時
コンソールアプリケーションと
Windowsアプリケーションを作る時文法が微妙に違うのはどうしてですか?

たとえば文字型の変数の宣言に
コンソールアプリケーションだと
String ○○;ですがWindowsアプリケーションだと^を付けないといけなかったり

同じC++なら文法も同じような気がするのですが?

的外れな質問をしていたらごめんなさい

ちなみに、バッチ処理で作ろうと思っていたプログラムは
”ドライブDから、画像ファイル(jpgと仮定)以外のファイル及びフォルダを含まないフォルダ(中に画像ファイルしか含んでいないフォルダ)”を探査して条件に一致する全てのフォルダ(イメージファイルしか入っていないフォルダ)を(D\picturefolder)へ移動、もちろんサブフォルダも含めて全フォルダに関して”

というものです、特殊文字の問題以外はクリアできたのですが・・・

投稿日時 - 2012-01-28 01:07:09

QNo.7270591

困ってます

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

C言語の良い所は「文字列は、文字列の中の文字コードに依存しない」って所。

文字列の中に%や^や?や*があろうが、非読文字の制御コードがあろうが、中身は気にしないのです。

>記号を含む文字や、キリル文字を含むフォルダ名ファイル名、また長すぎるパスが存在するとうまく動きません

この原因は「シェル(cmd.com)が、文字列を勝手に解析して、余計な事をするから」です。

前に別質問で回答したような気もしますが(違ってたらごめんなさい)「forとcallを併用すると、cmd.comが引数解析を2回行うので失敗する」と書いたように、引数解析はcmd.comがやっています。

>C++もコマンドプロンプト上で動く以上、Shift_JISに起因する問題に対処できず、バッチファイルの処理と同じように特殊な文字で動作が不安定になってしまったりするのでしょうか?教えて下さい

特殊文字の影響を受けるのは「main関数に渡されてくる引数のみ」です(cmd.comが引数の中身を作るので、cmd.comが加工し終わった文字列が渡されてきてしまう)

「main関数に渡されてくる引数を使わない」のであれば、一切、影響を受けません。

>コンソールアプリケーションと
>Windowsアプリケーションを作る時文法が微妙に違うのはどうしてですか?

異なるライブラリを使うからです。

>同じC++なら文法も同じような気がするのですが?

文法はまったく同じですよ。

「ヘッダファイルで定義されている識別子の名前が違うだけ」です。

なお、C、C++に用意されている「ファイル操作系ライブラリ」は、シングルバイト文字列用(ファイル名にシフトJISをサポート)、シングルバイトを拡張したワイド文字列用(ファイル名にシフトJISをサポート)、マルチバイト文字列用(ファイル名にUNICODEをサポート)など、ファイル名の文字コードに合わせたファイルライブラリがあるので、用途に合わせて使用して下さい。

繰り返しますが「文字列の中身は言語に依存しない」ので、プログラマ側で「この中身の文字コードはコレの筈」ってのを自前で管理しなければなりません。

C言語の文字列ってのは「単なるバイトデータの並び」に過ぎず、中身の文字コード体系は「プログラマ任せ」ですから。

投稿日時 - 2012-01-30 15:34:39

このQ&Aは役に立ちましたか?

4人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問