2010-07-20 64 views

回答

1

其他线程中提供的大多数解决方案都会不必要地转换为过时编码,而不是Unicode编码。只需使用reinterpret_cast<const char*>即可编写UTF-16文件,或使用WideCharToMultiByte转换为UTF-8。

要离开这个问题,使用LPTSTR而不是LPWSTR现在没什么意义,因为旧的9x系列Windows完全过时并且不受支持。只需使用LPWSTR和随处可见的“宽字符”(即,UTF-16代码单元)类型,如WCHARwchar_t

这里是(希望)写入一个示例UTF-16或UTF-32(后者在Linux/OS X):

#include <fstream> 
#include <string> 

int main() { 
    std::ofstream stream("test.txt"); // better use L"test.txt" on Windows if possible 
    std::wstring string = L"Test\n"; 
    stream.write(reinterpret_cast<const char*>(string.data()), string.size() * sizeof(wchar_t)); 
} 
+0

TTBOMK,但不保证'wofstream'将写入UTF-16。 IIRC,Dinkumware实现将写入(并读取FTM)UTF-8。 – sbi 2010-07-20 08:02:20

+0

非常感谢,它工作得很好:) – 2010-07-20 08:03:53

+0

@sbi:是的,我已经注意到在Linux上。 C++流只是吮吸。为了可靠地编写UTF-16,你似乎需要使用'ofstream'来防止C++的大脑死亡字符转换,并使用'reinterpret_cast'。如果Dinkumware库使用UTF-8,那很好,至少不是像Windows-1252这样的完全疯狂的选择。 – Philipp 2010-07-20 08:08:09

0

IIUC,LPTSTTR可能指向一个char字符串或wchar_t字符串,具体取决于预处理器指令。如果这是正确的,那么您需要在std::ofstreamstd::wofstream之间切换,具体取决于预处理器指令。
看一看this answer。它处理控制台流之间的切换,具体取决于TCHAR,但该方案也很容易适用于文件流。