10

私が取り組んでいるプロジェクトでは、かなりの数の文字列操作を扱っています。文字列は、エンコーディング(1バイトまたは2バイトの場合があります)とともにバイナリファイルから読み取られます。基本的に、一貫性を保つために、文字列値をとしてvector<char>読み取り、エンコーディングを読み取り、すべての文字列をに変換します。wstring

これはかなりうまく機能しますが、ファイル名自体は2バイト文字にすることができます。実際に入力ストリームを開く方法に完全に困惑しています。CIでは、関数の受け渡しを使用し_wfopenますが、ファイルから2バイト文字を読み取るために特別に設計されており、2バイトファイル名のファイルから1バイトを読み取るために設計されていないため、動作が異なるようです。wchar_t* pathwifstream

この問題の解決策は何ですか?

編集:ネットを検索すると、標準のC ++ではこれがまったくサポートされていないようです(たとえば、この説明を参照してください)。しかし、C++11が実際にこの分野で役立つ何かを追加するのかどうか疑問に思っています。

4

1 に答える 1

1

open に渡す文字列がファイル名にどのようにマップされるかは、実装に依存します。'/'Unix 環境では、ほとんど文字どおりに渡され、'\0'特別に扱われます。他の環境では、他のルールが適用されます。以前、Unix でファイルを作成し、Windows では何もできなかったため、問題が発生しました (':' ファイル名の a を特別に扱います)。

もう 1 つの問題は、これらのファイルがどこから来たのかということです。前述のように、システム上でファイルを開く方法がまったくない場合があります':'。Windows では、単に . Unix では'\0'、ファイル名自体に文字が含まれている場合、おそらくそれらも読み取ることができず、'\0'Unix では UTF16 ファイル名に文字が含まれているように見えます。唯一の解決策は、ファイルを生成したシステムでネイティブ ツールを使用して名前を変更することです。

そもそも Unix ディスクでそのようなファイル名を取得する方法がよくわかりません。Samba などの SMB サーバーは、Windows ボックスでサービスを提供しているときに UTF16 ファイル名をどのようにマップしますか? または、NFS サーバー — Windows にもそのようなものが存在すると思います。

于 2013-01-04T14:00:15.653 に答える