5

我对多字节字符字符串有疑问。我已将我的问题简化如下:

std::wstring str = L"multıbyte test string";
std::wofstream f;
f.open("F:\\dump.txt");
f << str;
f.close();

转储文件的内容是:“mult”

尽管我使用了 wstring 和 wofstream,为什么它会削减 str 的剩余部分?

谢谢

4

2 回答 2

1

wofstream使用当前语言环境写出数据。默认语言环境可能不支持多字节字符。

请参阅问题:无法将 std::wstring 写入 wofstream

您可以通过以下方式输出完整的字符串:

std::locale::global(std::locale(""));

但是,在编写之前,您不会在 Windows 上将字符作为 unicode 获取,因为它本身不支持 UTF-8 语言环境。

为此,您应该使用 将其转换为 std::string WideCharToMultiByte,并使用 regular 将其写出ofstream

于 2012-12-19T11:36:18.817 回答
0

您将不得不为输出流注入一些语言环境,以获得一些合理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)>);

还有codecvt_utf16.

于 2012-12-19T11:46:16.050 回答