如何将箭头符号写入文件然后将其读回?

时间:2014-04-09 11:41:12

标签: c++ unicode fstream

参考 http://www.fileformat.info/info/unicode/char/2192/index.htm表示unicode字符集中的右箭头为0x2192,因此我尝试以几种不同的方式将值写入文件:

#include <fstream>

using namespace std;

int main()
{
    ofstream out("out.txt");
    wofstream wout("wout.txt");

    out << '0x2192' << endl;
    out << '\u2192' << endl;
    out << L'\u2192' << endl;
    out << u'\u2192' << endl;

    wout << '0x2192' << endl;
    wout << '\u2192' << endl;
    wout << L'\u2192' << endl;
    wout << u'\u2192' << endl;

    return 0;
}

它只打印数字而没有箭头符号。我究竟做错了什么? PS我还想稍后回读这个角色。提前谢谢。

1 个答案:

答案 0 :(得分:3)

经过一些修改:

#include <fstream>
#include <locale>

using namespace std;

int main() {
    // This is the real trick, make the wfostream to print wide characters as
    // UTF-8
    // what we're going to do is to create a locale that has the ctype category
    // copied from the "en_US.UTF-8"
    std::locale loc=std::locale(std::locale(),"en_US.UTF8",std::locale::ctype);
    ofstream out("out.txt");
    // and now add the locale to the stream
    out.imbue(loc);
    wofstream wout("wout.txt");
    // and now add the locale to the stream
    wout.imbue(loc);

    //out << '0x2192' << endl;           // character constant too long (did not compile on g++)
    //out << '\u2192' << endl;           // character constant too long (did not compile on g++)
    out << L'\u2192' << endl;            // prints 8594
    out << u'\u2192' << endl;            // prints 8594
    out << (wchar_t) L'\u2192' << endl;  // prints 8594
    out << (wchar_t) u'\u2192' << endl;  // prints 8594

    //wout << '0x2192' << endl;          // character constant too long
    //wout << '\u2192' << endl;          // character constant too long
    wout << 8594 << endl;                // prints 8594
    wout << L'\u2192' << endl;           // prints ->
    wout << u'\u2192' << endl;           // prints 8594
    wout << (wchar_t) 8594 << endl;      // prints ->
    wout << (wchar_t) L'\u2192' << endl; // prints ->
    wout << (wchar_t) u'\u2192' << endl; // prints ->    
    return 0;
}

以上是在Ubuntu linux上执行的,并用g ++编译