4

我通过将文本文件添加到资源然后加载它来将其链接到我的项目中。

我使用LockResourceand astatic_cast将其转换为std::wstring
std::wstring sData(static_cast<wchar_t*>(pData));

我的项目使用 UNICODE (windows),这就是我使用std::wstringand的原因wchar_t

我发现我必须将文件中的编码设置为 UCS-2 LE,否则它只会读取乱码。我猜这是因为这是 Windows 使用的编码。

我的问题是,假设所有 Windows 操作系统当前都使用 UCS-2 LE 是否安全?我不想遇到使用 UCS-2 BE(或其他东西)的系统。我的程序会严重崩溃。

我可以将文件保存在 ANSI 中,然后将其转换为操作系统使用的任何编码MultiByteToWideChar,但如果它肯定是 UCS-2 LE,那将是浪费时间。

4

2 回答 2

6

所有最新和当前版本的 Windows(不包括 XBox)都使用 UTF-16 LE。

请注意,您如何初始化字符串变量存在一个错误:

std::wstring sData(static_cast<wchar_t*>(pData));

这假设资源以终止(两字节)0 结尾,如果您只是在资源中引用文件,我认为不能保证这一点。您应该获取资源的大小,并使用 sData 的两指针构造函数。

如果您担心时间(正如您对 using 的评论所建议的那样MultiByteToWideChar),您应该知道您正在将数据从资源复制到动态内存中,并且此复制可能几乎与进行转换一样慢。如果你只做一次,我不会担心速度。我会将文本保存为 UTF-8 并使用MultiByteToWideChar,特别是如果 UTF-8 编码对您的文本更有效,因为这会使您的二进制文件更小。

如果速度是一个问题(并且如果您不需要在运行时修改字符串),那么我根本不会使用 a std::wstring。我会创建一个提供类似接口的类,但让它直接指向资源内存,而不是将整个文本复制到动态内存中。这样可以节省加载时间和内存。

于 2012-08-29T15:51:48.330 回答
0

所有版本的 Windows 都是 LE,我认为微软没有计划将其操作系统更改为 BE。和 windows NT 5(Win2K) 及更高版本都基于 UTF-16,所以是的,假设 windows 是 UCS-2 LE 总是安全的

于 2012-08-29T15:14:52.077 回答