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

标签 c++ windows unicode character-encoding

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

我使用 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。我会创建一个提供类似接口(interface)的类,但让它直接指向资源内存,而不是将整个文本复制到动态内存中。这样可以节省加载时间和内存。

关于c++ - 假设所有 Windows 平台都在 UCS-2 LE 中是否安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12181123/

相关文章:

python - 在python中,提取非英语单词

windows - 如何以跨平台友好的方式处理 C/C++ 中的 Unicode 字符串?

c++ - #ifdef VALUE 与 #if Defined (VALUE) 之间有什么区别

c - SIGSEGV,Windows 中的段错误,但在 Linux 中运行良好

python:为什么os.makedirs会导致WindowsError?

windows - 难道不能从线程 ID 获取句柄吗?

c++ - 在 C++ 中什么时候使用 WCHAR 什么时候使用 CHAR

c++ - 编写 OpenMAX IL 组件,从哪里开始

c++ - 将命令行参数/fstream 传递给函数

c++ - 其他用户帐户上的 OpenProcess iexplore.exe 因访问被拒绝而失败