假设所有Windows平台都在UCS-2 LE中是否安全
Is it safe to assume all Windows platforms will be in UCS-2 LE
我正在将一个文本文件链接到我的项目中,方法是将其添加到资源中,然后加载它。
我使用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
。我会创建一个提供类似接口的类,但让它直接指向资源内存,而不是将整个文本复制到动态内存中。这样可以节省加载时间和内存。
所有版本的windows都是LE,我不认为微软有计划将其操作系统更改为BE。windows NT 5(Win2K)和更高版本都基于UTF-16,所以是的,假设windows是UCS-2 LE 总是安全的
- 将C++ std::string 转换为 UTF-16-LE 编码的字符串
- 蓝牙LE:设置字节数组的特征会发送错误的值
- C 在使用UCS-2 LE编码的文件中搜索短语
- 如何在Unicode/UCS CodePoint和UTF16替代对之间转换
- UTF-8到UCS-2与icu库的转换
- 假设所有Windows平台都在UCS-2 LE中是否安全
- 如何读取UCS-2文件
- 目标'o.le-v7-g/.moc/moc_applicationui.cpp'配方失败
- UCS-4 到 Solaris 上的多字节转换
- 在 OSX 上使用C++的蓝牙 LE(扫描)
- 如何在Windows 8.1上断开蓝牙LE设备
- clang:将const char16_t* (UTF-16)转换为wstring (UCS-4)
- Java - JNI - 将UCS-2字符转换为jchar(即Java的char)
- 蓝牙LE在Windows桌面使用Qt
- Visual C++ 2013 程序在 IDE 中工作,但在 InstallShield LE 安装后不加载任何显示内容
- 非托管的c++ BT/LE在RP/Win和结对编程,可能的