假设所有Windows平台都在UCS-2 LE中是否安全

Is it safe to assume all Windows platforms will be in UCS-2 LE

本文关键字:LE UCS-2 是否 安全 Windows 平台 假设      更新时间:2023-10-16

我正在将一个文本文件链接到我的项目中,方法是将其添加到资源中,然后加载它。

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

我的项目使用UNICODE(windows),这就是我使用std::wstringwchar_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,所以是的,假设windows是UCS-2 LE 总是安全的