相关疑难解决方法(0)

多平台方式将std :: wstring写入C++文件中

我一直在努力做一些看起来很简单的事情:将内容写入std :: wstring到磁盘.假设我有以下要写入纯文本文件的字符串:

std::wstring s = L"???."; // random characters pulled from baidu.cn
Run Code Online (Sandbox Code Playgroud)
  1. 使用std::codecvt_utf8或提升语言环境

这是我使用的代码:

std::wofstream out(destination.wstring(), std::ios_base::out | std::ios_base::app);
const std::locale utf8_locale = std::locale(std::locale(), new boost::locale::utf8_codecvt<wchar_t>());
out.imbue(utf8_locale);
// Verify that the file opened correctly
out << s << std::endl;
Run Code Online (Sandbox Code Playgroud)

这在Windows上运行良好,但遗憾的是我在Linux上编译它:codecvt_utf8在通常的发行版提供的编译器上还没有提供,而Boost:Locale只包含在Boost 1.60.0中,这也是一个太近的版本对于发行版的存储库.如果不设置区域设置,则不会向文件写入任何内容(在两个系统上).

  1. 用fwrite

下一次尝试:

FILE* out = fopen("test.txt", "a+,ccs=UTF-8");
fwrite(s.c_str(), wcslen(s.c_str()) * sizeof(wchar_t), 1, out);
fclose(out);
Run Code Online (Sandbox Code Playgroud)

这适用于Windows,但不会在Linux上向该文件写入任何内容.我也尝试以二进制模式打开文件,但这并没有改变任何东西.不设置该ccs部分会导致无法解密的垃圾写入文件.

我显然在这里遗漏了一些东西:将该字符串写入文件的正确方法是什么?

c++ encoding character-encoding

17
推荐指数
1
解决办法
684
查看次数

是一个宽字符串文字,以L开头,如L"Hello World",保证用Unicode编码吗?

我最近试图全面了解创建支持unicode的独立于平台的C++应用程序所需的步骤.这是混淆给我的是,大多数的HOWTO和东西平衡的字符编码(即ANSI或Unicode)和字符类型(char或wchar_t的).正如我到目前为止所了解的那样,这些是不同的东西,可能存在一个用Unicode编码的字符序列,但用std :: string表示,以及用ANSI编码的字符序列,但表示为std :: wstring,对吗?

因此,我想到的问题是C++标准是否对字符串文字的编码提供任何保证,L或者它是否只是说具有特定于实现的字符编码的类型为wchar_t?

如果没有这样的保证,这是否意味着我需要某种外部资源系统以独立于平台的方式为我的应用程序提供非ASCII字符串文字?这是什么首选方式?资源系统或源文件的正确编码加上适当的编译器选项?

c++ unicode

13
推荐指数
1
解决办法
2万
查看次数

我如何编写std :: codecvt方面?

我如何编写std :: codecvt方面?我喜欢写那些从UTF-16去UTF-8,从UTF-16去系统当前代码页(窗口,所以CP_ACP),以及系统的OEM代码页(窗口,所以CP_OEM).

跨平台是首选,但Windows上的MSVC也很好.关于如何正确使用这个类,是否有任何类型的教程或任何性质的东西?

c++ windows codecvt

12
推荐指数
1
解决办法
5390
查看次数

标签 统计

c++ ×3

character-encoding ×1

codecvt ×1

encoding ×1

unicode ×1

windows ×1