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

时间:2012-08-29 15:11:14

标签: c++ windows unicode character-encoding

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

我使用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,那将浪费时间。

2 个答案:

答案 0 :(得分:5)

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

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

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

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

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

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

答案 1 :(得分:0)

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