gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 23:33:27 27 4
gpt4 key购买 nike

最近想在Windows下写一个unicode(UTF-16)的文本文件。

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

当我用记事本打开文档时,显示如下。 换行符似乎消失了!!!

alt text
(来源:google.com)

当我使用选择了 UTF-16 编码的 Firefox 时,显示如下。

alt text
(来源:google.com)

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

  1. UTF-16 - 不。垃圾展示。
  2. UTF-16BE - 不。垃圾展示。
  3. UTF-16LE - 很好。能够显示多行。

我的猜测是,我需要提供额外的字节排序信息吗?但是如何呢?

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

请附上!永远不要建议我使用 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();
}

最佳答案

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

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

关于c++ - UTF-16 编码类型,在 Windows 中使用 wofstream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3098607/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com