Jos*_*osh 4 c++ windows unicode character-encoding
我通过将文本文件添加到资源然后加载它来将文本文件链接到我的项目中.
我使用LockResource和a static_cast将它投射到一个std::wstring
std::wstring sData(static_cast<wchar_t*>(pData));
我的项目采用UNICODE(窗口),这就是为什么我使用std::wstring和wchar_t.
我发现我必须将文件中的编码设置为UCS-2 LE,否则它只会读取乱码.我猜这是因为这是Windows使用的编码.
我的问题是,假设所有Windows操作系统目前都使用UCS-2 LE是否安全?我不想使用UCS-2 BE(或其他东西)进入系统.我的节目会崩溃.
我可以节省在ANSI文件,然后将其转换成什么都编码在操作系统使用MultiByteToWideChar,但是这将是浪费时间,如果它肯定会是UCS-2 LE.
所有最近和当前版本的Windows(不包括XBox)都使用UTF-16 LE.
请注意,如何初始化字符串变量有一个错误:
std::wstring sData(static_cast<wchar_t*>(pData));
Run Code Online (Sandbox Code Playgroud)
这假设资源以终止(双字节)0结束,如果您只是引用资源中的文件,我认为这是不可保证的.您应该获得资源的大小,并使用sData的双指针构造函数.
如果您担心时间(正如您对使用的评论所建议的那样MultiByteToWideChar),您应该知道您正在将数据从资源复制到动态内存中,并且此副本可能与执行转换一样慢.如果你这样做一次,我不会担心速度.我将文本保存为UTF-8,并使用MultiByteToWideChar,特别是如果UTF-8编码对您的文本更有效,因为这会使您的二进制文件更小.
如果速度是一个问题(如果您不需要在运行时修改字符串),那么我根本不会使用a std::wstring.我创建了一个提供类似接口的类,但让它直接指向资源内存,而不是将整个文本复制到动态内存中.这节省了加载时间和内存.