unicode和框架无法解决的问题

| 我遇到了一个非常奇怪的问题...以下简单的测试代码可以正常工作,如果将其注入到单个Cocoa应用程序中,但是当我在我的一个框架中使用它时,绝对会得到意想不到的结果...
wchar_t Buf[2048];
wcscpy(Buf, L\"/zbxbxklbvasyfiogkhgfdbxbx/bxkfiorjhsdfohdf/xbxasdoipppwejngfd/gjfdhjgfdfdjkg.sdfsdsrtlrt.ljlg/fghlfg\");
int len1 = wcslen(L\"/zbxbxklbvasyfiogkhgfdbxbx/bxkfiorjhsdfohdf/xbxasdoipppwejngfd/gjfdhjgfdfdjkg.sdfsdsrtlrt.ljlg/fghlfg\");
int len2 = wcslen(Buf);

char Buf2[2048];
Buf2[0]=0;
wcstombs(Buf2, Buf, 2048);

// ??? Buf2 == \"\"
// ??? len1 == len2 == 57, but should be 101
我生气了怎么可能?即使发生内存损坏,也可能无法损坏堆栈上分配的所有这些值...为什么连wcslen(L \“ MyWideString \”)也不起作用?更改测试字符串会更改其长度,但这始终是错误的,wcstombs返回-1 ... setlocale()不会在任何地方使用,测试字符串仅包含ASCII字符,为了简化移植,我使用了-fshort-wchar编译器选项,但是在测试Cocoa应用程序的情况下效果很好。 请帮忙!     
已邀请:
        我刚刚使用GCC 4.6再次进行了测试。在标准设置中,这可以按预期工作,所有长度都为101。但是,使用您的选项
-fshort-wchar
我也会得到意外的结果(在我的情况下为51,使用setlocale()之后的最终转换为251)。 因此,我查找了该选项的人条目:   警告:-fshort-wchar开关使GCC生成的代码与没有该开关的代码不二进制兼容。使用它来符合非默认应用程序二进制接口。 我认为这可以解释这一点:当您链接到标准库时,应该使用正确的ABI和类型约定,而该约定将被该选项覆盖。     
        C / C ++中的宽字符实现可以是任何东西,包括1个字节,2个字节或4个字节。这取决于编译器和要编译到的平台。 维基百科可能不是引用的最佳地点,但在这种情况下: http://en.wikipedia.org/wiki/Wide_character指出   ... wchar_t的宽度是特定于编译器的,可以小至8位。 和   ...由于历史兼容性原因,C90下的宽字符应为16位值。符合10646-1:2000 Unicode标准的C和C ++编译器通常采用32位值。 因此,请勿假定并使用
sizeof(wchar_t)
。     
        “ 1”更改编译器的ABI,因此您需要使用wchar_t重新编译glibc,libgcc和所有库。否则,glibc中的wcslen和其他函数仍假定wchar_t为4字节。 参见:http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42092     

要回复问题请先登录注册