- ベストアンサー
C++コンソールアプリケーションと文字コードの処理について
- C++のコンソールアプリケーションでは、特殊な文字コードや記号を含むファイルやフォルダを扱う際に問題が発生します。
- これは、コマンドプロンプトがShift_JISしか扱えないためです。
- 一方で、Windowsアプリケーションでは、特殊文字コードや記号の処理が可能です。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
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言語の文字列ってのは「単なるバイトデータの並び」に過ぎず、中身の文字コード体系は「プログラマ任せ」ですから。