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