在 iOS 中,如果我使用vswprintf
非西方语言环境,它将失败并返回 -1。
但是,如果我正确设置语言环境,它将正确写入。
为什么是这样?有任何想法吗?
在 iOS 中,如果我使用vswprintf
非西方语言环境,它将失败并返回 -1。
但是,如果我正确设置语言环境,它将正确写入。
为什么是这样?有任何想法吗?
奇怪的是vswprintf
,iOS 上的实现将它提供的宽字符串参数转换为窄字符串,然后将结果转换回宽字符串(我不得不调试一次这个问题)。如果您的宽字符串中包含非 ASCII 字符,那么这是有损转换,并且只有某些字符可以成功转换。
可以转换的确切非 ASCII 字符集取决于当前的语言环境设置。如果您尝试传入不受支持的字符,vswprintf
则将通过返回-1
并设置errno
为错误EILSEQ
(非法多字节序列)而失败。
至少在 Mac OS X 上,您可以通过切换到 UTF-8 语言环境来解决这个问题,例如:
setlocale(LC_CTYPE, "UTF-8")
但是,这似乎不适用于 iOS,因此如果您需要能够在vswprintf
不事先知道语言环境的情况下使用所有字符,除非您自己重新实现,否则恐怕您会不走运vswprintf
。