- 论坛徽章:
- 0
|
因为不是在电脑cpu上跑的程序,代码需要在其他设备中跑,设备中没有MultiByteToWideChar,所以需要实现类似MultiByteToWideChar的功能。只要考虑ANSI 0~127 的字符加上gb2312中文就好, utf-8等其他编码都不考虑。 MultiByteToWideChar的源码过于复杂看不懂(reactos里),所以想找个替代函数,并且是有源码的。于是找到了 mbstowcs,但测试结果不一样。下面是测试代码:- #include <iostream>
- #include <string>
- using namespace std;
- #include <windows.h>
- std::wstring Ansi2WChar(LPCSTR pszSrc, int nLen)
- {
- int nSize = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pszSrc, nLen, 0, 0);
- if(nSize <= 0) return NULL;
- WCHAR* pwszDst = new WCHAR[nSize + 1];
- if(NULL == pwszDst) return NULL;
- MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pszSrc, nLen, pwszDst, nSize);
- pwszDst[nSize] = 0;
- if(pwszDst[0] == 0xFEFF) // skip Oxfeff
- for(int i = 0; i < nSize; i++)
- pwszDst[i] = pwszDst[i + 1];
- std::wstring wcharString(pwszDst);
- delete pwszDst;
- return wcharString;
- }
- std::wstring s2ws(const std::string& s){
- return Ansi2WChar(s.c_str(), s.size());
- }
- int main() {
- string s = "一二三"; // 内存中为:d2 bb b6 fe c8 fd
- { // 正确的结果
- wstring ws = s2ws(s); // 这里面用了 MultiByteToWideChar
- // 这里ws得到正确结果: 00 4e 8c 4e 09 4e
- }
- { // 错误的结果
- wchar_t wstr[100] = {0};
- std::mbstowcs(wstr, s.data(), s.size()); // 这里用了mbstowcs
- // 这里的wstr得到错误结果:d2 00 bb 00 b6 00 fe 00 c8 00 fd 00
- }
- }
复制代码 中文 “一二三”
用MultiByteToWideChar得到: 00 4e 8c 4e 09 4e
用mbstowcs得到:d2 00 bb 00 b6 00 fe 00 c8 00 fd 00
不知道是哪里有问题?
|
|