关于C语言setlocale()是否仅支持locale -a列出的区域设置的技术咨询
关于C语言setlocale()是否仅支持locale -a列出的区域设置的技术咨询
你说得完全没错!在Linux环境下用C语言的setlocale()函数时,确实只能设置那些通过locale -a命令列出的区域设置——这可不是什么模糊的限制,是实打实的规则。
为啥会这样呢?其实原理很简单:Linux系统的区域设置数据都是以文件形式存放在特定系统目录里的(比如/usr/share/locale或者/usr/lib/locale),locale -a命令做的就是扫描这些目录,把已经安装好的区域设置列出来。而setlocale()函数在调用时,需要加载对应区域的配置和数据文件,如果某个区域设置没被安装,系统找不到对应的文件,那这个函数调用自然就会失败。
你提到的Ubuntu默认只显示英文和C/Posix区域设置的情况太常见了——很多Linux发行版为了节省磁盘空间,默认只会预装最基础的区域包。而Java的情况和C完全不同:Java本身自带了一套完整的区域设置数据,不依赖系统层面的安装包,所以它能支持的区域设置范围要广得多,这就是两者核心的差异点。
如果需要使用其他区域设置,其实也有办法解决:你可以通过系统的包管理器安装对应的语言包,比如在Ubuntu上,想要用简体中文区域的话,就可以安装language-pack-zh-hans包。安装完成后再运行locale -a,就能看到对应的zh_CN.utf8这类区域选项了,这时候setlocale()就能正常设置它啦。
备注:内容来源于stack exchange,提问作者NikS
相关产品推荐
相关产品推荐

