swprintf使用\ xffff unicode字符失败

时间:2014-08-07 17:35:02

标签: c wchar-t

使用Visual Studio 2013运行的以下代码行:

wchar_t test[] = L"\xffff";
wchar_t buf[100];    
int ret = swprintf(&buf[0], 100, L"%ls", &test[0]);

它成功编译,但swprintf无法输出此字符(res为-1)。除了 \ xffff 之外,任何其他角色都可以。此字符可以位于字符串的任何位置,并且swprintf仍然失败。有什么问题?

1 个答案:

答案 0 :(得分:3)

MSVC / MSVCRT具有16位wchar_t,因此使用0xffff作为WEOF的值,从而阻止它成为有效字符,并且在使用时必须导致错误像这样。这并不能真正排除使用Unicode 字符,因为U+FFFF是Unicode中的非字符,但它仍然是非常不受欢迎的行为,因为UTF应该是处理所有 Unicode标量值,而不仅仅是字符。

唯一的“修复”是使用32位wchar_t的正确实现(我认为cygwin应该适用于Windows但我不确定;否则,任何类似unix的系统)。