wchar_t

iOS Android平台下的wchar_t默认size问题

很久以前曾经被wchar的问题在iOS和Android上被坑过,这次是在参研一份有年头的代码时又遇到了宽字符的问题,当然,也是和wchar有关系的,就是这个wchar在各个系统平台下的sizeof问题,关键的是一段UTF-8转UTF-16的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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坑,宽字符函数不支持之类的,但是仔细看了下并没有用到什么字符串函数,转换部分也是自己实现的,最后在各平台调试器的帮助下找到了问题:
Continue reading…

又是wchar_t的问题,这次是Apple LLVM compiler 3.0的bug!

之前发现过Android上NDK对wchar_t以及相关函数的支持不足问题,后来又发现过iOS上类似的setlocale问题。最近在更新了Xcode 4.2以后,发现之前用的wchar_t相关的东西都不对了,wcslen函数返回的字符串长度不对,而且在gdb中用p查看const wchar_t*变量时,显示的是const void*,貌似就没有wchar_t相关的东西。

这个问题如果切换编译器为之前的LLVM GCC编译器则一切正常,浪费了很多时间排查错误,最后发现更新了最近的Xcode 4.3(4E109)带的Apple LLVM compiler 3.1就没问题了。啊!原来是3.0的BUG。