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

msk*_*skw 5 c c++ unicode localization ios

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

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

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

Ada*_*eld 9

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

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

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

setlocale(LC_CTYPE, "UTF-8")
Run Code Online (Sandbox Code Playgroud)

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