记一次ubuntu docker 镜像 java 中文乱码问题查找
2016-09-09 00:00
218 查看
java 测试代码
public class Test { public static void main(String[] args) { System.out.println(java.nio.charset.Charset.defaultCharset()); System.out.println(System.getProperty("file.encoding")); System.out.println("这是一段中文"); } }
Dockerfile
FROM ubuntu:14.04 # 时区 RUN ln -sf /usr/share/zoneinfo/Asia/Chongqing /etc/localtime && \ echo "Asia/Chongqing" > /etc/timezone && \ mkdir -p /etc/sysconfig/ && \ echo -e "ZONE="Asia/Chongqing"\nUTC=false\nRTC=false" > /etc/sysconfig/clock # jdk/jre/server-jre ENV JAVA_TYPE=server-jre ENV JAVA_VERSION_MAJOR=8 ENV JAVA_VERSION_DETAIL=101 COPY "${JAVA_TYPE}-${JAVA_VERSION_MAJOR}u${JAVA_VERSION_DETAIL}-linux-x64.tar.gz" /tmp/ RUN tar -zxf /tmp/${JAVA_TYPE}-${JAVA_VERSION_MAJOR}u${JAVA_VERSION_DETAIL}-linux-x64.tar.gz -C /opt/ RUN rm /tmp/${JAVA_TYPE}-${JAVA_VERSION_MAJOR}u${JAVA_VERSION_DETAIL}-linux-x64.tar.gz RUN ln -s /opt/jdk1.${JAVA_VERSION_MAJOR}.0_${JAVA_VERSION_DETAIL} /opt/${JAVA_TYPE}${JAVA_VERSION_MAJOR} RUN ls /opt/${JAVA_TYPE}${JAVA_VERSION_MAJOR} RUN update-alternatives --install /usr/bin/java java /opt/${JAVA_TYPE}${JAVA_VERSION_MAJOR}/bin/java 100 RUN update-alternatives --install /usr/bin/javac javac /opt/${JAVA_TYPE}${JAVA_VERSION_MAJOR}/bin/javac 100 ENV JAVA_HOME=/opt/${JAVA_TYPE}${JAVA_VERSION_MAJOR}
docker 容器内测试
测试c.utf-8root@e23dde2b15f3:/tmp# locale LANG= LANGUAGE= LC_CTYPE="POSIX" LC_NUMERIC="POSIX" LC_TIME="POSIX" LC_COLLATE="POSIX" LC_MONETARY="POSIX" LC_MESSAGES="POSIX" LC_PAPER="POSIX" LC_NAME="POSIX" LC_ADDRESS="POSIX" LC_TELEPHONE="POSIX" LC_MEASUREMENT="POSIX" LC_IDENTIFICATION="POSIX" LC_ALL= root@e23dde2b15f3:/tmp# vi Test.java root@e23dde2b15f3:/tmp# javac Test.java root@e23dde2b15f3:/tmp# java Test US-ASCII ANSI_X3.4-1968 root@e23dde2b15f3:/tmp# export LANG=C.UTF-8 root@e23dde2b15f3:/tmp# export LANG=C.UTF-8 root@e23dde2b15f3:/tmp# 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= root@bed9245d00ee:/tmp# java Test UTF-8 UTF-8
测试 en_US.UTF-8
root@50563c7d7aea:/# locale LANG= LANGUAGE= LC_CTYPE="POSIX" LC_NUMERIC="POSIX" LC_TIME="POSIX" LC_COLLATE="POSIX" LC_MONETARY="POSIX" LC_MESSAGES="POSIX" LC_PAPER="POSIX" LC_NAME="POSIX" LC_ADDRESS="POSIX" LC_TELEPHONE="POSIX" LC_MEASUREMENT="POSIX" LC_IDENTIFICATION="POSIX" LC_ALL= root@50563c7d7aea:/# vi Test.java root@50563c7d7aea:/# javac Test.java root@50563c7d7aea:/# java Test US-ASCII ANSI_X3.4-1968 root@50563c7d7aea:/# export LANG=en_US.UTF-8 root@50563c7d7aea:/# 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 LANGUAGE= LC_CTYPE="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_COLLATE="en_US.UTF-8" LC_MONETARY="en_US.UTF-8" LC_MESSAGES="en_US.UTF-8" LC_PAPER="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" LC_IDENTIFICATION="en_US.UTF-8" LC_ALL= root@50563c7d7aea:/# java Test US-ASCII ANSI_X3.4-1968 root@50563c7d7aea:/# locale-gen en_US.UTF-8 Generating locales... en_US.UTF-8... done Generation complete. root@50563c7d7aea:/# locale LANG=en_US.UTF-8 LANGUAGE= LC_CTYPE="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_COLLATE="en_US.UTF-8" LC_MONETARY="en_US.UTF-8" LC_MESSAGES="en_US.UTF-8" LC_PAPER="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" LC_IDENTIFICATION="en_US.UTF-8" LC_ALL= root@50563c7d7aea:/# java Test UTF-8 UTF-8
locale
root@c44b590a4d16:/# locale -a C C.UTF-8 POSIX root@c44b590a4d16:/# vi Test.java # 直接编译java时 报错 root@c44b590a4d16:/# export LANG=C.UTF-8 root@c44b590a4d16:/# javac Test.java root@c44b590a4d16:/# java Test UTF-8 UTF-8 这是一段中文 root@c44b590a4d16:/# export LANG=en_US.UTF-8 root@c44b590a4d16:/# javac Test.java # 这时候编译java会报错 root@c44b590a4d16:/# java Test US-ASCII ANSI_X3.4-1968 ?????? root@c44b590a4d16:/# locale-gen en_US.UTF-8 Generating locales... en_US.UTF-8... done Generation complete. root@c44b590a4d16:/# locale -a C C.UTF-8 en_US.utf8 POSIX root@c44b590a4d16:/# locale LANG=en_US.UTF-8 LANGUAGE= LC_CTYPE="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_COLLATE="en_US.UTF-8" LC_MONETARY="en_US.UTF-8" LC_MESSAGES="en_US.UTF-8" LC_PAPER="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" LC_IDENTIFICATION="en_US.UTF-8" LC_ALL= root@c44b590a4d16:/# java Test UTF-8 UTF-8 这是一段中文
问题分析:
在默认情况下, locale 只有C, C.UTF-8, POSIX, 所以
当export LANG=C.UTF-8 打印为 UTF-8, 中文显示正常
当export LANG=en_US.UTF-8 打印为 US-ASCII, ANSI_X3.4-1968, 中文显示不正常
执行 locale-get en_US.UTF-8 之后 打印为 UTF-8, 中文显示正常
相关文章推荐
- 解决ubuntu中java1.6显示中文乱码问题
- 解决ubuntu中java1.6显示中文乱码问题
- Ubuntu/Debian下JAVA 中文/图片中文字体乱码显示问题解决方法
- Ubuntu/Debian下JAVA 中文/图片中文字体乱码显示问题解决方法
- Java 关于中文乱码问题的解决方案与经验
- java 中文乱码问题实验
- Java/JSP中文乱码问题解决心得
- Java写的GUI程序在Gnome下显示中文乱码,不显示菜单等问题
- Java 关于中文乱码问题的解决方案与经验
- Java/JSP中文乱码问题解决心得
- java下mysql中文乱码问题的解决
- Java乱码问题,最后一个中文字乱码,shit!
- Java 关于中文乱码问题的解决方案与经验
- 红旗4.1系统解决JAVA中文乱码问题
- 初接触JAVA国际化问题-解决JAVA中文字符乱码
- 解决Linux下Java控制台中文乱码问题
- Java 关于中文乱码问题的解决方案与经验 (2)
- Java 关于中文乱码问题的解决方案与经验 (1)
- Java 关于中文乱码问题的解决方案与经验 (2)
- 解决java中文乱码问题