5

在 iOS 中,如果我使用vswprintf非西方语言环境,它将失败并返回 -1。

但是,如果我正确设置语言环境,它将正确写入。

为什么是这样?有任何想法吗?

4

1 回答 1

10

奇怪的是vswprintf,iOS 上的实现将它提供的宽字符串参数转换为窄字符串,然后将结果转换回宽字符串(我不得不调试一次这个问题)。如果您的宽字符串中包含非 ASCII 字符,那么这是有损转换,并且只有某些字符可以成功转换。

可以转换的确切非 ASCII 字符集取决于当前的语言环境设置。如果您尝试传入不受支持的字符,vswprintf则将通过返回-1并设置errno为错误EILSEQ(非法多字节序列)而失败。

至少在 Mac OS X 上,您可以通过切换到 UTF-8 语言环境来解决这个问题,例如:

setlocale(LC_CTYPE, "UTF-8")

但是,这似乎不适用于 iOS,因此如果您需要能够在vswprintf不事先知道语言环境的情况下使用所有字符,除非您自己重新实现,否则恐怕您会不走运vswprintf

于 2012-07-30T02:16:06.837 回答