很久以前曾经被wchar的问题在iOS和Android上被坑过,这次是在参研一份有年头的代码时又遇到了宽字符的问题,当然,也是和wchar有关系的,就是这个wchar在各个系统平台下的sizeof问题,关键的是一段UTF-8转UTF-16的代码:
size_t Utf8ToUtf16(const char* src_, wchar_t* dest_, size_t destlen_, size_t srclen_ /*= 0*/) { if (srclen_ == 0) srclen_ = _utf_length(src_); size_t destcapacity = destlen_; for (size_t idx = 0; ((idx < srclen_) && (destcapacity > 0));) { wchar_t cp; unsigned char cu = src_[idx++]; if (cu < 0x80) cp = (wchar_t)(cu); else if (cu < 0xE0) { cp = ((cu & 0x1F) << 6); cp |= (src_[idx++] & 0x3F); } else if (cu < 0xF0) { cp = ((cu & 0x0F) << 12); cp |= ((src_[idx++] & 0x3F) << 6); cp |= (src_[idx++] & 0x3F); } else { cp = L'?'; } *dest_++ = cp; --destcapacity; } return destlen_ - destcapacity; }
这段代码在win下可以正常将utf-8的char*转换为utf-16的char*,但在Android, iOS下却不能得到和win下一样的转换结果,刚发现这个问题时,以为又是当年遇到的wchar坑,宽字符函数不支持之类的,但是仔细看了下并没有用到什么字符串函数,转换部分也是自己实现的,最后在各平台调试器的帮助下找到了问题:
原来,wchar在win下是2 bytes,而在iOS Android等*nix系平台下默认是4 bytes,本以为要自己定义个short来替代,好在在万能的google帮助下,找到了这个compiler option: -fshort-wchar,加到c c++的编译flag里即可解决这个问题,但一定要注意全项目的统一性,别lib里是4 bytes的,exe里是2 bytes的,那就该天下大乱了。
博主友情提示:
如您在评论中需要提及如QQ号、电子邮件地址或其他隐私敏感信息,欢迎使用>>博主专用加密工具v3<<处理后发布,原文只有博主可以看到。