我将一个文本文件链接到我的项目中,将其添加到资源中,然后加载它。
我使用LockResource
和一个static_cast
将其转换为std::wstring
std::wstring sData(static_cast<wchar_t*>(pData));
我的项目使用UNICODE(Windows),这就是为什么我使用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));
这假定资源以一个终止(双字节)0结束,如果您只是在您的资源中引用文件,我不认为这是保证。 您应该获得资源的大小,并使用sData的双指针构造函数。
如果您担心时间(正如您对使用MultiByteToWideChar
的评论所建议的那样),您应该意识到您正在将资源中的数据复制到动态内存中,而这个副本可能与执行转换几乎一样慢。 如果你只是这样做一次,我不会担心速度。 我将文本保存为UTF-8,并使用MultiByteToWideChar
,特别是如果UTF-8编码对您的文本更有效,那么会使您的二进制文件更小。
如果速度是一个问题(如果你不需要在运行时修改字符串),那么我根本不会使用std::wstring
。 我会创建一个提供类似接口的类,但它直接指向资源内存,而不是将整个文本复制到动态内存中。 这节省了加载时间和内存。
所有版本的Windows都是LE,我不认为微软有计划将其操作系统更改为BE。 和Windows NT 5(Win2K)和更高版本都基于UTF-16所以是的,它总是安全的假设窗口是UCS-2 LE