UTF-16编码的类型,在Windows中使用wofstream

时间:2010-06-23 02:47:49

标签: c++ unicode wofstream

最近,我想在Windows下用unicode(UTF-16)编写一个文本文件。

通过引用http://www.codeproject.com/KB/stl/upgradingstlappstounicode.aspx,这是我正在申请的代码。

当我使用记事本打开文档时,这是显示。 换行似乎消失了!!!

alt text http://sites.google.com/site/yanchengcheok/Home/notepad.png

当我使用选择了UTF-16编码的Firefox时,这里是显示。

alt text http://sites.google.com/site/yanchengcheok/Home/firefox-utf16-encoding.PNG

我尝试使用以下编码在JEdit下打开

  1. UTF-16 - 不。垃圾展示。
  2. UTF-16BE - 没有。垃圾展示。
  3. UTF-16LE - 很好。能够显示多行。
  4. 我的猜测是,我需要提供额外的字节排序信息?但是如何?

    我的目标是让这个UTF-16文档在记事本下能够很好地显示,因为我的客户只是喜欢使用记事本。

    P / S请!不建议我使用UTF-8。谢谢。

    #include <iostream>
    #include <fstream>
    #include <iomanip>
    #include <locale>
    #include <windows.h>
    #include <tchar.h>
    // For StringCchLengthW.
    #include <Strsafe.h>
    #include <cassert>
    
    using namespace std;
    
    // appearing in the NullCodecvtBase typedef.
    using std::codecvt ; 
    typedef codecvt < wchar_t , char , mbstate_t > NullCodecvtBase ;
    
    class NullCodecvt
        : public NullCodecvtBase
    {
    
    public:
        typedef wchar_t _E ;
        typedef char _To ;
        typedef mbstate_t _St ;
    
        explicit NullCodecvt( size_t _R=0 ) : NullCodecvtBase(_R) { }
    
    protected:
        virtual result do_in( _St& _State ,
                       const _To* _F1 , const _To* _L1 , const _To*& _Mid1 ,
                       _E* F2 , _E* _L2 , _E*& _Mid2
                       ) const
        {
            return noconv ;
        }
        virtual result do_out( _St& _State ,
                       const _E* _F1 , const _E* _L1 , const _E*& _Mid1 ,
                       _To* F2, _E* _L2 , _To*& _Mid2
                       ) const
        {
            return noconv ;
        }
        virtual result do_unshift( _St& _State , 
                _To* _F2 , _To* _L2 , _To*& _Mid2 ) const
        {
            return noconv ;
         }
        virtual int do_length( _St& _State , const _To* _F1 , 
               const _To* _L1 , size_t _N2 ) const _THROW0()
        {
            return (_N2 < (size_t)(_L1 - _F1)) ? _N2 : _L1 - _F1 ;
        }
        virtual bool do_always_noconv() const _THROW0()
        {
            return true ;
        }
        virtual int do_max_length() const _THROW0()
        {
            return 2 ;
        }
        virtual int do_encoding() const _THROW0()
        {
            return 2 ;
        }
    } ;
    
    #define IMBUE_NULL_CODECVT( outputFile ) \
    { \
    (outputFile).imbue( std::locale(locale::classic(), new NullCodecvt )) ; \
    } 
    
    int main()
    {
        std::wofstream file;
        IMBUE_NULL_CODECVT( file ) ;
        file.open(L"C:\\可以爱我吗.TXT", ios::out | ios::binary);
        file << L"ABC" << std::endl;
        file << L"我爱你" << std::endl;
        file << L"Bye bye" << std::endl;
    
        printf("done\n");
        getchar();
    }
    

1 个答案:

答案 0 :(得分:4)

执行ios::binary时,文件以二进制模式打开,这意味着换行符不会在Windows上转换为正确的\ r \ n编码。

如果您编写"\r\n"而不是std :: endl,它应该在记事本中工作。我不确定这是否是最佳解决方案。