为什么printf系列函数关心语言环境?

时间:2012-07-29 23:08:38

标签: c++ ios c unicode localization

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

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

这是为什么?有什么想法吗?

1 个答案:

答案 0 :(得分:9)

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

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

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

setlocale(LC_CTYPE, "UTF-8")

然而,这似乎不适用于iOS,所以如果您需要能够提前vswprintf所有角色而不知道区域设置,我担心除非您重新实现,否则您将失去运气vswprintf你自己。