• linux C.UTF-8和en-US.UTF-8语言环境有什么区别?(中文乱码问题)locale命令 centos、ubuntu修改编码集(没搞定!)


    问题背景

    我在ubuntu16.04虚拟机和英伟达盒子ubuntu18.04上分别部署了ngrest服务

    postman请求,ubuntu16.04虚拟机返回的中文是乱码,英伟达盒子ubuntu18.04不是乱码

    用vi打开文件,ubuntu16.04虚拟机显示中文不是乱码,英伟达盒子ubuntu18.04是乱码

    我用echo $LANG命令查看发现(或者直接用locale命令)

    我的ubuntu16.04虚拟机显示为en_US.UTF-8

    在这里插入图片描述

    在这里插入图片描述

    英伟达盒子ubuntu18.04显示为C.UTF-8

    在这里插入图片描述

    在这里插入图片描述

    查看C.UTF-8和en-US.UTF-8语言环境差异

    可能会有一些影响,因为它们在排序顺序、大小写关系、排序顺序、数千分隔符、默认货币符号等方面有所不同。
    C.utf8=POSIX标准兼容的默认语言环境。只有严格的ASCII字符才是有效的,扩展后允许基本使用UTF-8
    en_US.utf8=美式英语UTF-8语言环境。
    虽然我不确定您可能遇到的具体效果,但我相信如果需要,您可以在应用程序中设置语言环境和编码。

    一般来说,C指的是计算机,en_US指的是我们中说英语的人(以及其他想要同样行为的人)。
    computer的意味着字符串有时更标准(但仍然是英语),因此程序的输出可以从其他程序读取。使用en_US,字符串可以得到改进,字母顺序可以得到改进(可能通过芝加哥风格规则的新规则等)。
    所以更方便用户,但可能不太稳定。注意:语言环境不仅用于字符串的转换,还用于排序(字母顺序、数字(例如千位分隔符)、货币(我认为可以安全地预测美元和小数点后两位)、月份、星期几等。
    在您的例子中,它只是两个地区的UTF-8版本。
    一般来说,这不重要。我通常更喜欢enúUS.UTF-8,但通常不重要,在您的情况下(服务器应用程序),它应该只更改日志和错误消息(如果您使用locale.setlocale())。
    您应该在应用程序中处理客户端区域设置。从其他程序读取的程序应该在打开管道之前设置C,所以这并不重要。
    如你所见,也许这无关紧要。您还可以使用POSIX语言环境,也可以在Debian中定义。您可以使用locale -a获得已安装区域设置的列表。
    注意:微优化将规定C/C.UTF-8语言环境:不翻译文件(gettext),以及关于排序和数字格式的简单规则,但这应仅在服务器端可见。

    关于locale

    参考文章:Linux深入探索16-区域设置:locale

    修改编码集

    centos(没验证)

    1. 安装编码集
      localedef -v -c -i en_US -f UTF-8 C.UTF-8
    2. vim /etc/sysconfig/i18n
      写入如下内容
      LANG=“C.UTF-8”
      LC_ALL=“C.UTF-8”
    3. vim /etc/profile
      export LANG=“C.UTF-8”
      export LC_ALL=“C.UTF-8”
    4. source /etc/profile
    5. locale

    参考文章:Centos修改编码集为C.UTF-8

    ubuntu

    在我们英伟达盒子ubuntu18.04上执行/etc/default/locale查看内容为:

    root@ubuntu:/etc/default# vi locale 
    
    LANG="en_US.UTF-8"
    
    
    • 1
    • 2
    • 3
    • 4

    在我们ubuntu16.04虚拟机上执行/etc/default/locale内容为:

    root@xy-virtual-machine:/etc/default# vi locale 
    
    #  File generated by update-locale
    LANG="en_US.UTF-8"
    LANGUAGE="en_US:en"
    LC_NUMERIC="en_US.UTF-8"
    LC_TIME="en_US.UTF-8"
    LC_MONETARY="en_US.UTF-8"
    LC_PAPER="en_US.UTF-8"
    LC_IDENTIFICATION="en_US.UTF-8"
    LC_NAME="en_US.UTF-8"
    LC_ADDRESS="en_US.UTF-8"
    LC_TELEPHONE="en_US.UTF-8"
    LC_MEASUREMENT="en_US.UTF-8"
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    因为我们英伟达盒子是符合要求的,所以我猜想是否将虚拟机的/etc/default/locale文件内容改成跟盒子一样就行了?

    想归这么想,但是上面有一句File generated by update-locale,我查看update-locale,貌似有特定方法能设置,,,

    直接执行update-locale LANG=C.UTF-8

    在这里插入图片描述

    提示*** update-locale: Warning: LANGUAGE ("en_US:en") is not compatible with LANG (C.UTF-8). Disabling it.,网上说不用管它,参考文章:OSSIM开源系统汉化解决方案

    然后我们断开xshell,再连接,输入locale,发现修改成功了

    在这里插入图片描述

    但是postman请求返回还是乱码,我们重启虚拟机试试,重启后连接发现,并未生效

    在这里插入图片描述
    莫非还真要修改真实文件?

    我们打开/etc/default/locale,将内容修改成

    LANG=C.UTF-8
    LANGUAGE=
    LC_CTYPE="C.UTF-8"
    LC_NUMERIC="C.UTF-8"
    LC_TIME="C.UTF-8"
    LC_COLLATE="C.UTF-8"
    LC_MONETARY="C.UTF-8"
    LC_MESSAGES="C.UTF-8"
    LC_PAPER="C.UTF-8"
    LC_NAME="C.UTF-8"
    LC_ADDRESS="C.UTF-8"
    LC_TELEPHONE="C.UTF-8"
    LC_MEASUREMENT="C.UTF-8"
    LC_IDENTIFICATION="C.UTF-8"
    LC_ALL=
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    重启虚拟机,虽然修改成功了,但还是乱码

    貌似这样直接修改文件是自欺欺人行为,它真实的编码不是在这统揽全局的

    我们这样:

    update-locale LANG=C.UTF-8
    update-locale LANGUAGE=
    update-locale LC_CTYPE="C.UTF-8"
    update-locale LC_NUMERIC="C.UTF-8"
    update-locale LC_TIME="C.UTF-8"
    update-locale LC_COLLATE="C.UTF-8"
    update-locale LC_MONETARY="C.UTF-8"
    update-locale LC_MESSAGES="C.UTF-8"
    update-locale LC_PAPER="C.UTF-8"
    update-locale LC_NAME="C.UTF-8"
    update-locale LC_ADDRESS="C.UTF-8"
    update-locale LC_TELEPHONE="C.UTF-8"
    update-locale LC_MEASUREMENT="C.UTF-8"
    update-locale LC_IDENTIFICATION="C.UTF-8"
    update-locale LC_ALL=
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    update-locale LANG=C.UTF-8 && \
    update-locale LANGUAGE= && \
    update-locale LC_CTYPE="C.UTF-8" && \
    update-locale LC_NUMERIC="C.UTF-8" && \
    update-locale LC_TIME="C.UTF-8" && \
    update-locale LC_COLLATE="C.UTF-8" && \
    update-locale LC_MONETARY="C.UTF-8" && \
    update-locale LC_MESSAGES="C.UTF-8" && \
    update-locale LC_PAPER="C.UTF-8" && \
    update-locale LC_NAME="C.UTF-8" && \
    update-locale LC_ADDRESS="C.UTF-8" && \
    update-locale LC_TELEPHONE="C.UTF-8" && \
    update-locale LC_MEASUREMENT="C.UTF-8" && \
    update-locale LC_IDENTIFICATION="C.UTF-8" && \
    update-locale LC_ALL=
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    update-locale LC_ALL=“C.UTF-8” 没用。。。

    重启虚拟机,还是不行

    把配置文件改成

    LANG="en_US.UTF-8"
    
    
    • 1
    • 2

    重启还是不行,,我了个去。。。。。累死我了

    最后一种方法,直接加启动配置文件!

    /etc/profile文件后面增加

    #arnold add 20221117 start
    chmod 777 /usr/sbin/update-locale
    update-locale LANG=C.UTF-8
    update-locale LC_CTYPE="C.UTF-8"
    update-locale LC_NUMERIC="C.UTF-8"
    update-locale LC_TIME="C.UTF-8"
    update-locale LC_COLLATE="C.UTF-8"
    update-locale LC_MONETARY="C.UTF-8"
    update-locale LC_MESSAGES="C.UTF-8"
    update-locale LC_PAPER="C.UTF-8"
    update-locale LC_NAME="C.UTF-8"
    update-locale LC_ADDRESS="C.UTF-8"
    update-locale LC_TELEPHONE="C.UTF-8"
    update-locale LC_MEASUREMENT="C.UTF-8"
    update-locale LC_IDENTIFICATION="C.UTF-8"
    #arnold add 20221117 end
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    重启虽然设置成功了,还是没用。。。请求返回依然乱码

    我搞不定啊,尴尬了🤣

  • 相关阅读:
    纯css html 真实水滴效果
    PreparedStatement vs Statement 不同及其使用
    C++ inline函数
    俄罗斯方块游戏开发教程5:形状碰撞检测(下)
    贪心算法学习——加油站
    【思悟】一定要给自己留出空间
    使用Gorm动态更新数据表中的字段
    瑞吉外卖实战项目全攻略——优化篇第二天
    聊聊ChatGPT是如何组织对话的
    Ajax零基础入门 Ajax零基础入门第一天
  • 原文地址:https://blog.csdn.net/Dontla/article/details/127900914