【问题标题】:swprintf fails with \xffff unicode charactersswprintf 因 \xffff Unicode 字符而失败
【发布时间】:2014-10-01 01:28:36
【问题描述】:

使用 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 仍然失败。有什么问题?

【问题讨论】:

  • 您需要修复错误。
  • 当您询问错误消息时,您需要在问题中包含错误消息的确切文本。
  • 如果它包含代码点 U+FFFF,则它不是一个有效的 Unicode 字符串。见Can a valid Unicode string contain FFFF
  • 输出是否保存到一个文件中,这样您就可以对其进行十六进制转储并知道该函数失败/成功输出?或者您正在查看带有文本输出的屏幕 - 在这种情况下,您怎么知道 '\xffff' 必须打印可见的内容?

标签: c wchar-t


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-06
    相关资源
    最近更新 更多