2009-05-04 79 views
42

WindowsアプリケーションのC++標準ライブラリを使用してファイルを開くのは難しいと思われますが、それは基本的なことです。ここではUnicodeはUTF-8を意味しますが、UTF-16などに変換できます。ポイントはUnicodeファイル名からofstreamインスタンスを取得しています。自分のソリューションをハックする前に、ここに優先ルートがありますか?特にクロスプラットフォームのプラットフォームですか?uniodeファイル名でstd :: fstream(ofstreamまたはifstream)を開く方法は?

+0

Iこれは、[複製](http://stackoverflow.com/questions/480849/windows-codepage-interactions-with-standard-cc-filenames)であります質問。そこにある回答が役立つかどうかを確認してください。 –

+0

'std :: wofstream'のようなデータ型を使わないのはなぜですか? ** w **に注意してください! – sergiol

答えて

51

C++標準ライブラリはUnicode対応ではありません。 charおよびwchar_tは、Unicodeエンコーディングである必要はありません。 MSVCを使用してWindows上で

wchar_tはUTF-16ですが、標準ライブラリのUTF-8のファイル名には直接のサポートはありません(charデータ型は、Windows上でUnicodeではない)

(したがって、MicrosoftのSTL) 、ファイルストリームのコンストラクタは、あなたのようにストリームを作成することができ、const wchar_t*ファイル名をとる用意されています

wchar_t const name[] = L"filename.txt"; 
std::fstream file(name); 

しかし、この過負荷がC++ 11規格で規定されていないが(それが唯一の存在を保証しますcharベースのバージョン)。バージョンg ++ 4.8.xでは、GCCのMinGW用libstdC++(-w64)のような代替STL実装にも存在しません。

Windowsのcharと同じように、UTF8ではなく、他のOSではwchar_tがUTF16でない場合があります。全体的に見て、これは移植性がない可能性があります。 wchar_tというファイル名のストリームを開くことは標準では定義されておらず、charにファイル名を指定するのは難しいかもしれません。

+0

"fstreamは両方のwchar_tを受け入れることが保証されています..."とはどういう意味ですか?私は公式の98標準にアクセスすることはできませんが、n2857のbasic_fstreamのwchar_t * ctor(つまり、現在のC++ 0x作業草案であるIIUC)を見つけることができません –

+0

あなたが正しいように見えます。私は修正済みです – jalf

+0

@Éric:basic_fstreamのコンストラクタは'03標準の27.8.1.12で定義されており、引数なしとchar *の2つがあります。fstreamはbasic_fstream であり、その特殊化のために定義された追加メンバーはありません。 –

3

現在のバージョンのVisual C++のstd :: basic_fstreamにはopen()メソッドがあり、これはhttp://msdn.microsoft.com/en-us/library/4dx08bh4.aspxに従ってwchar_t *をとります。

+0

これは最終的に/理論的に移植可能になるのだろうか? –

+3

すべてのOSとファイルシステムがUnicodeファイル名をサポートするわけではありませんので、移植性がありません。 NTFSはUnicodeファイル名をサポートしているので、wchar_t * open()とfstreamのコンストラクタはMicrosoftの拡張です。 –

+3

またはNTFSがUTF16を使用してUnicodeファイル名をエンコードするためです。 LinuxはUnicodeのファイル名もサポートしていますが、UTF8を使用していますので、通常のchar *のバージョンはそこで動作します – jalf

1

std::wofstream,std::wifstreamおよびstd::wfstreamを使用する。彼らはユニコードファイル名を受け入れます。ファイル名はwstring、配列はwchar_tであるか、_T()マクロ、またはテキストの前にプレフィックスLが必要です。

+0

'std :: wfstream'が' Unicode'であるという証拠を提供できますか?私の知る限りでは、ワイド文字である 'wchar_t'を使用します。通常は' 16-bit'です。しかし、内容は「Unicode」であってもなくてもかまいません。 –

+0

私が言ったのは、彼らが質問に答えるユニコード文字列を受け入れるということですね。 – Brackets

+0

実際には、質問の半分に答えます.WFストリーム(またはあなたのfstreamのUTF8)でファイルパスUTF16を取得したとしましょう。 WindowsはUnicodeを受け入れず、特殊文字(中国語など)を使用している場合は「間違ったURL」を返します。 –

0

Boost.Nowideを見てください:

#include <boost/nowide/fstream.hpp> 
#include <boost/nowide/cout.hpp> 
using boost::nowide::ifstream; 
using boost::nowide::cout; 

// #include <fstream> 
// #include <iostream> 
// using std::ifstream; 
// using std::cout; 

#include <string> 

int main() { 
    ifstream f("UTF-8 (e.g. ß).txt"); 
    std::string line; 
    std::getline(f, line); 
    cout << "UTF-8 content: " << line; 
} 
関連する問題