私たちのコードは以前はファイル名に日本語の文字を含むファイルを書き込んでいたが、すべての場合に機能しなくなったとお客様から苦情が寄せられています。ファイル名を表すために古き良き char * 文字列を常に使用していたので、それが機能したことに少しショックを受けました。私たちのソフトウェアからエクスポートされたファイル名が埋め込まれたファイルを送ってもらいました。文字列は、日本語の文字を表すために 2 バイト シーケンスの最初の文字として 16 進数の文字 82 と 83 を使用しているようです。オンラインで調べてみると、これはおそらく SHIFT_JIS および/または Windows コードページ 932 であると思われます。
何が起こっているかは、以前は fopen と ofstream::open の両方で、このコードページを使用して受け入れられたファイル名のように見えます。今では fopen だけが行います。Visual Studio の fopen のドキュメントを確認しましたが、fopen に渡す文字列として許容されるものについてのヒントはありません。
短期的には、誰かが特定の Windows fopen と ofstream::open の問題に光を当ててくれることを願っています。長期的には、C++、Windows、Linux、および OS X で Unicode (およびその他の?) ファイル名を開くための受け入れられている方法を知りたいと思っています。
追加するために編集: 機能するオープンは「C」ロケールで行われるのに対し、機能しないオープンは顧客のデフォルトのロケールが何であれ行われると思います。しかし、それは何年も前からのケースであり、プログラムの古いバージョンは現在でも彼らのシステムで動作しているため、これは私たちが目にしている問題を説明するためのロングショットのようです.
更新: お客様に小さなテスト プログラムを送信しました。fopen が SHIFT_JIS ファイル名で正常に動作することを確認しましたが、std::ofstream は動作しません。これは Visual Studio 2005 で発生し、既定のロケールを使用したか "C" ロケールを使用したかに関係なく発生しました。
誰かがこの動作の説明を持っているかどうか (そして、なぜそれが不思議に変わったのか - おそらく VS2005 のサービス パック?) を知り、移植可能な C++ コードで Unicode ファイル名を処理するための包括的な「ベスト プラクティス」をまとめたいと思っています。