我对多字节字符字符串有疑问。我已将我的问题简化如下:
std::wstring str = L"multıbyte test string";
std::wofstream f;
f.open("F:\\dump.txt");
f << str;
f.close();
转储文件的内容是:“mult”
尽管我使用了 wstring 和 wofstream,为什么它会削减 str 的剩余部分?
谢谢
wofstream
使用当前语言环境写出数据。默认语言环境可能不支持多字节字符。
请参阅问题:无法将 std::wstring 写入 wofstream
您可以通过以下方式输出完整的字符串:
std::locale::global(std::locale(""));
但是,在编写之前,您不会在 Windows 上将字符作为 unicode 获取,因为它本身不支持 UTF-8 语言环境。
为此,您应该使用 将其转换为 std::string WideCharToMultiByte
,并使用 regular 将其写出ofstream
。
您将不得不为输出流注入一些语言环境,以获得一些合理codecvt
的方面来wchar_t
进行char
转换。如果您有支持 C++11 的编译器或 Visual Studio 2010 及更高版本,则可以使用 UTF-8 facet ( codecvt_utf8
):
f.imbue(
std::locale ( // using std::locale constructed from
std::locale (), // global locale
// and codecvt_utf8 facet
new std::codecvt_utf8<char, 0x10FFFF,
static_cast<std::codecvt_mode>(std::consume_header
| std::little_endian)>);