Linux下setlocale( LC_ALL , "zh_CN.GBK" ) 设置失败

六道佩恩 2021-01-01 11:59:49
Linux下好像只能设置UTF-8,不能设置GBK?
Linux的编码环境怎么修改?
locale -a列出的是所有支持的设置吗?
...全文
2616 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
ctrigger 2021-01-02
  • 打赏
  • 举报
回复
TO: forever74 楼上精辟啊,赞一个。
顺便show一下我的Fedora 33:
forever74 2021-01-02
  • 打赏
  • 举报
回复
喝茶的时候想想,操作系统这个东西,只有在它还是源代码的时候,那些内核程序员有资格对它动手动脚。 一旦它运行起来,尽管如今它还没有智能,但是它有自己的规矩,我等写应用程序的猿只能在它规定的框架下做事,偶尔请求它帮个忙。 在它那一亩三分地儿,它就是天道。 好在我们活在系统外,不爽的时候可以给它断电,格式化,重装。
ctrigger 2021-01-02
  • 打赏
  • 举报
回复
LANG=zh_CN.GB2312
forever74 2021-01-02
  • 打赏
  • 举报
回复
BTW,在这个设置成功完成以后,接着都用w系的库函数,就再也不要用printf啦puts啦这些函数了,因为它们会捣乱的。
forever74 2021-01-02
  • 打赏
  • 举报
回复
你似乎对这个函数的作用有些误解,以为你想设置什么就设置什么。 其实不是这样的。 这个函数设置的其实是程序员预期的将来这个程序要运行的环境的本地字符集。 也就是说,如果你预期你这个代码编译以后要运行在windows 7 8 10上,那你才能那样写。 当然,这需要编译器和库系统的支持,配合一大堆交叉编译配置,你才能才linux上编译链接出.exe来。 所以,如果你的代码要在你执行编译的机器上运行,你就看看环境变量LANG是啥,你就只能设成啥,更好的办法是两个双引号中间啥也不敲。
赵4老师 2021-01-02
  • 打赏
  • 举报
回复
是 无法改为GBK 是 以上答案都是我瞎猜的。
forever74 2021-01-02
  • 打赏
  • 举报
回复
好吧,又错了,我之前的回复是今天的,不是昨天。
forever74 2021-01-02
  • 打赏
  • 举报
回复
好吧,抱歉我没说清楚。 setlocale函数能设置什么取决于你系统上都安装了哪些locale,安装问题去找安装程序解决,安装了哪些用locale -a查询。 但是每个进程都可以调用setlocale设置自身的外在编码属性。 我们用linux的时候,因为我们讨论的是编译和运行,那么这个时候我们的代码编译出来的可执行文件它的环境就是调用执行它的那个进程。这个进程多半(但不是一定)是个bash,我们代码里的setlocale得是安装好的才能执行,同时得是和环境设置相同/兼容的才能显示出正确的文字,这就是昨天我说“只能”的意思。因为我们很多时候不拥有修改环境的权限,所以只能迁就环境。 但是对于bash来说,你可以通过修改环境变量来让它重新setlocale,export LC_ALL=zh_CN.GBK 就可以让bash去搞GBK了,然后在这个bash里你的程序也GBK的话就能正常显示文字了。 --------------------------------------------- 我们的障碍在于源代码文件本身默认需要UTF8编码,这是gcc的需要,要折腾gcc是另外的话题。 这样一个非UTF8的bash可以正常运行和它相同setlocale的可执行程序,但是在cat源代码的时候反而会乱码了。 综上,我们一般的思路是,因为gcc默认需要UTF8的源代码,所以我们得在UTF8的环境下写源码,所以我们运行UTF8的shell,而要在UTF8的shell里运行我们的程序并正常显示字符,我们的程序里需要setlocale成UTF8。 --------------------------------------------- 当然,如果一个程序是个服务器程序,它的执行过程中根本不在本机显示字符,那就是另一回事了。
赵4老师 2021-01-02
  • 打赏
  • 举报
回复
sudo apt-get -y install language-pack-zh-hans
  • 打赏
  • 举报
回复
Linux内核使用UTF-32,API层使用UTF-8,不支持UTF-16和MBCS(除非程序自己处理编码),Linux中的宽字符wchar_t是UTF-32编码,与windows中的UTF-16不同
赵4老师 2021-01-02
  • 打赏
  • 举报
回复
好像可以另行安装对中文的支持。搜一下
六道佩恩 2021-01-02
  • 打赏
  • 举报
回复
引用 4 楼 ctrigger 的回复:
LANG=zh_CN.GB2312
这个是某个配置文件里的设置还是setlocale的设置?GB2312、GBK、GB18030我都试过了(setlocale),都是失败
六道佩恩 2021-01-02
  • 打赏
  • 举报
回复
引用 1 楼 赵4老师 的回复:
是 无法改为GBK 是 以上答案都是我瞎猜的。
编码环境那个,我是指locale命令列出来的结果的那个,有办法让它变为zh_CN.GBK吗?
六道佩恩 2021-01-02
  • 打赏
  • 举报
回复
引用 6 楼 ctrigger 的回复:
TO: forever74 楼上精辟啊,赞一个。 顺便show一下我的Fedora 33:
为什么你的支持gbk等编码,我的zh_CN只有UTF-8?

70,040

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧