gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 14:06:12 33 4
gpt4 key购买 nike

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

我使用 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/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com