• 【烦人的字符集】linux字符集问题,中文乱码


    【1】快速修改命令

      


    【2】locale 查看现在服务器的字符

    [root@Master ~]# locale
    LANG=en_US.UTF-8
    LC_CTYPE="zh_CN.UTF-8"
    LC_NUMERIC="zh_CN.UTF-8"
    LC_TIME="zh_CN.UTF-8"
    LC_COLLATE="zh_CN.UTF-8"
    LC_MONETARY="zh_CN.UTF-8"
    LC_MESSAGES="zh_CN.UTF-8"
    LC_PAPER="zh_CN.UTF-8"
    LC_NAME="zh_CN.UTF-8"
    LC_ADDRESS="zh_CN.UTF-8"
    LC_TELEPHONE="zh_CN.UTF-8"
    LC_MEASUREMENT="zh_CN.UTF-8"
    LC_IDENTIFICATION="zh_CN.UTF-8"
    LC_ALL=zh_CN.UTF-8

    locale -a 查看服务器支持哪些字符集:

    打印太多,多虑下 zh---中国 表示支持的中国字符集有:

    [root@Master ~]# locale -a|grep zh
    zh_CN
    zh_CN.gb18030
    zh_CN.GB18030
    zh_CN.gb2312
    zh_CN.gbk
    zh_CN.utf8
    zh_HK
    zh_HK.big5hkscs
    zh_HK.utf8
    zh_SG
    zh_SG.gb2312
    zh_SG.gbk
    zh_SG.utf8
    zh_TW
    zh_TW.big5
    zh_TW.euctw
    zh_TW.utf8
    注意:

    zh_CN.utf8 待会设置的时候可以大写也可以小写,utf-8 ==== UTF-8
    locale 的变量是什么意思?
    LC_ALL > LC_* > LANG
    LANG,LC_*的默认值,是最低级别的设置,如果LC_*没有设置,则使用该值。
    LC_ALL,它是一个宏,如果该值设置了,则该值会覆盖所有LC_*的设置值。注意,LANG的值不受该宏影响

    【2.1】locale每个变量是干嘛的?

    Locale的命名规则:<语言>_<地区名>.<字符编码名称>
    对于zh_CN.GB2312而言,zh表示中文,CN表示大陆地区,GB2312表示使用的字符集为GB2312。
    LC_COLLATE
    用于比较和排序。
    LC_CTYPE
    用于字符分类和字符串处理,控制所有字符的处理方式,包括字符编码,字符是单字节还是多字节,如何打印等。
    LC_MONETORY
    用于格式化货币单位。
    LC_NUMERIC
    用于格式化非货币的数字显示。
    LC_TIME
    用于格式化时间和日期。
    LC_MESSAGES
    用于控制程序输出时所使用的语言,主要是提示信息,错误信息,状态信息, 标题,标签, 按钮和菜单等。
    LC_ALL
    它不是环境变量,只是一个宏,可使用setlocale设置所有的LC_*环境变量。这个变量设置之后,可以废除LC_*和LANG的设置值,使得这些变量的设置值与LC_ALL的值一致。
    LANG
    它的值用于指定上面环境变量没有设置的所有变量值。如果指定了上面任何一个变量的值,则会废除对应的LANG值的缺省设置。

    【3】情景模拟

    情景1、设置中文:不显示中文目录等等

    首先得确定,设置两种字符集,一个是你的服务器,一个是你连接服务器的终端。当然不用远程肯定就不用设置终端,终端是putty,secureCRT,xshell等等。
    设置服务器:

    export LC_ALL=zh_CN.UTF-8
    长久之计,
    echo export LC_ALL=zh_CN.UTF-8 >> ~/.bashrc
    终端设置:secureCRT

    选项-绘画选项-外观

    下拉列表选择你的语言,细心找找

    情景2、svn up 时出现,cannot .......utf-8.........

    解决方案:

    <1>快速方案:
    直接 在shell输入: export LC_ALL=en_US.UTF-8,locale 命令看看有没有错误,无错误 执行 svn up
    <2>由于方案<1>只能针对此shell管用,下次再次进入shell时,仍需要重新设置,所以有长久方案:
    编辑 /etc/profile文件, 如图
    svn: E000022: Can't convert string from native enc

    需要重新打开新的shell

    情景3、locale 的时候出现 cannot set

    [root@Master ~]# locale
    locale: Cannot set LC_CTYPE to default locale: No such file or directory
    locale: Cannot set LC_MESSAGES to default locale: No such file or directory
    locale: Cannot set LC_ALL to default locale: No such file or directory
    LANG=en_US.UTF-8
    LC_CTYPE="zh_CN.UTF-8"
    LC_NUMERIC="zh_CN.UTF-8"
    LC_TIME="zh_CN.UTF-8"
    LC_COLLATE="zh_CN.UTF-8"
    LC_MONETARY="zh_CN.UTF-8"
    LC_MESSAGES="zh_CN.UTF-8"
    LC_PAPER="zh_CN.UTF-8"
    LC_NAME="zh_CN.UTF-8"
    LC_ADDRESS="zh_CN.UTF-8"
    LC_TELEPHONE="zh_CN.UTF-8"
    LC_MEASUREMENT="zh_CN.UTF-8"
    LC_IDENTIFICATION="zh_CN.UTF-8"
    LC_ALL=zh_CN.UTF-8
    这种情况最坑,找遍各种资料,无果。

    这种情况是因为glibc 相关造成的,可能是机器最近更新了glibc 等等。我就是这种情况

    你可以

    1、可能没有装这个,yum试试,如果装了,第二步

    yum install glibc-common
    2、是不是升级了glibc,环境变量,打印看看

    我之前为了某软件方便,直接在 /etc/profile写入下面这行。

    #export LD_LIBRARY_PATH=/opt/glibc-2.14/lib:$LD_LIBRARY_PATH
    把这行注释,locale不会报错了。

    [root@Master ~]# locale
    LANG=en_US.UTF-8
    LC_CTYPE="zh_CN.UTF-8"
    LC_NUMERIC="zh_CN.UTF-8"
    LC_TIME="zh_CN.UTF-8"
    LC_COLLATE="zh_CN.UTF-8"
    LC_MONETARY="zh_CN.UTF-8"
    LC_MESSAGES="zh_CN.UTF-8"
    LC_PAPER="zh_CN.UTF-8"
    LC_NAME="zh_CN.UTF-8"
    LC_ADDRESS="zh_CN.UTF-8"
    LC_TELEPHONE="zh_CN.UTF-8"
    LC_MEASUREMENT="zh_CN.UTF-8"
    LC_IDENTIFICATION="zh_CN.UTF-8"
    LC_ALL=zh_CN.UTF-8

    以下部分转自:https://blog.csdn.net/fzuzhanghao1993/article/details/77650500

    情景4、glibc2.12升级glibc2.14导致乱码

      勇敢的骚年哟,请问你要的是这个glibc2.12呢还是这个glibc2.14呢。。。由于隔壁部门坑爹的SO,需要我把glibc升级到2.14,于是苦逼的程序员开始了艰辛的升级之旅~~

    升级的过程不用说了,网上一抓一大把,粗制滥造的就算了,CSDN上有很多篇很详细的文章,不过纵观全网大量的文章居然都漏了一个重要步骤,直接就导致了后面locale的设置问题。

    大部分教程make && make install完成后,直接开始设置软连接,设置完以后文章就结束了!然后你以为就没事了吗,接下来就开始:

    locale: Cannot set LC_CTYPE to default locale: No such file or directory
    locale: Cannot set LC_ALL to default locale: No such file or directory

    VI编辑器打开日志,各种^M 各种口口口,各种乱码~~

    于是我又开始设置locale,设置i18n,各种没用啊卧槽!我的服务器到底是肿么了。。。

    千辛万苦最后才知道,拜托make完还要make localedata好伐!!

    make localedata/install-locales

    终于,打开服务器不报错了,vi也正常了。。。重要的事情说三遍


    make localedata/install-locales
    make localedata/install-locales
    make localedata/install-locales

    如果你的系统是ubuntu:
    参照:https://www.ttlsa.com/linux/howto-change-ubuntu-locale/

  • 相关阅读:
    String StringBuffer StringBuilder 之间的区别
    StringBuffer和String的相互转换
    StringBuffer的替换和反转和截取功能
    StringBuffer的添加与删除功能
    后端——框架——容器框架——spring_core——容器
    后端——框架——容器框架——spring_core——bean以及xml配置
    后端——框架——容器框架——spring_core——注解
    后端——框架——容器框架——spring_core——国际化 & Properties
    后端——框架——容器框架——spring_core——Resource
    后端——框架——容器框架——spring_core——校验器
  • 原文地址:https://www.cnblogs.com/gered/p/10902884.html
Copyright © 2020-2023  润新知