惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

爱范儿
爱范儿
大猫的无限游戏
大猫的无限游戏
J
Java Code Geeks
MongoDB | Blog
MongoDB | Blog
Martin Fowler
Martin Fowler
GbyAI
GbyAI
Microsoft Azure Blog
Microsoft Azure Blog
Recent Announcements
Recent Announcements
F
Fortinet All Blogs
B
Blog
U
Unit 42
B
Blog RSS Feed
D
DataBreaches.Net
Google DeepMind News
Google DeepMind News
人人都是产品经理
人人都是产品经理
腾讯CDC
量子位
酷 壳 – CoolShell
酷 壳 – CoolShell
V
Visual Studio Blog
博客园 - 聂微东
MyScale Blog
MyScale Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 三生石上(FineUI控件)
Engineering at Meta
Engineering at Meta

小松鼠的博客

记录一次线上k8s工作节点无法创建容器的问题排查思路与解决办法 记一次线上GoLang项目OOM排查过程 从LastPass转向拥抱开源KeePass的心路历程 故障定位与 AI 结合前后端编码实践 FileBeat收集nginx-ingress-controller日志 K8s云原生环境下文件描述符占用过高查询思路 2024年最新关闭火绒安全工具的开机自启方法 Kubernetes任务调度实践-Go语言实现Job和CronJob对比分析 离线更新k8s环境下的trivy漏洞库方法 使用Go语言接入Choerodon实现基于OAuth2的统一身份认证登录 在Vue2中自定义Switch组件并实现父子组件双向数据绑定 Go框架gin中的session存储gin-contrib-sessions和go-session 关于修改node_module中的源码问题记录 docker-compose网络和内网服务IP冲突问题 慎用存储过程:一条语句引发的数据库存储100%占用 Spring Boot中4种文件下载方法的实现 避坑-不能将specific类型的gitlab-runner改变为share类型 Docker compose中的MySQL主从复制模式和percona-toolkit工具使用 在minio中开启https访问以及使用rclone备份minio桶 在多机Docker环境下部署Choerodon的解决方案 Prometheus中Monitor添加对SpringBoot Actuator的Basic认证 在Nginx的容器镜像中隐藏Nginx的Server响应头 K8s中的两种nginx-ingress-controller及其区别 两个docker工具:runlike和whaler Grafana中的邮件报警和截图插件grafana-image-enderer K8s中externalName-service和services-without-selectors maven配置文件settings.xml中的一些概念总结 K8s中flexvolume插件驱动的安装 K8s中的coredns无法解析svc问题排查 K8s中使用Ingress访问请求体过大问题解决
关于docker jdk1.8镜像中的GB18030-2022标准支持及验证
ycyin · 2023-08-09 · via 小松鼠的博客

2023年8月8日大约 3 分钟云原生DockerGB18030-2022


国家标准《信息技术 中文编码字符集GB18030-2022》发布于 2022-07-19并于2023-08-01正式实施,需要对系统编码支持进行改造升级。本文介绍关于在K8s/Docker云环境背景,在jdk1.8环境下容器镜像中的GB18030-2022标准支持及验证。

先说结论,openjdk官方在8u381 这个版本对GB18030-2022进行了支持,参见:https://bugs.openjdk.org/browse/JDK-8301119 ,对应github地址:https://github.com/openjdk/jdk/pull/12518 在该Bugs报告记录中还可以发现8u381、8u39、openjdk8u382、openjdk8u392 、11.0.20、17.0.8、20.0.2对其都进行了修复。

对于JDK1.8已支持GB18030-2022的对应镜像如下:

OpenJDK官方镜像:adoptopenjdk/openjdk8:x86_64-debian-jdk8u382-b05 更新日志

OracleJDK镜像:container-registry.oracle.com/java/jdk:8u381-oraclelinux8 (需要注册登录后拉取) 更新日志

关于验证:

自定义一个CharsetSupportValidation.java小程序,根据输入的charsetName进行转换Charset charset = Charset.forName(charsetName);如果抛出UnsupportedCharsetException则不支持这个编码集。

另外还尝试进行编码和解码操作,看能否正常转换编码。比如如下步骤验证的是输入一串Unicode编码看能否正常转换为GB18030-2022编码。(\u9fec国家标准|GB 18030-2022 (samr.gov.cn)第164/746页一个新增的中文字符,unicode编码为9fec,GB18030-2022编码为82359633)。如下Original和Decoded显示一个空白框猜测是容器中的linux环境不支持造成的。

root@Ubuntu:~/dockerfiles/javabase# docker run --rm -it container-registry.oracle.com/java/jdk:8u381-oraclelinux8 /bin/bash
[root@884b90c73fb1 /]#
[root@884b90c73fb1 /]# vi CharsetSupportValidation.java
[root@884b90c73fb1 /]# javac CharsetSupportValidation.java
[root@884b90c73fb1 /]# java CharsetSupportValidation GB18030-2022 \u9fec
Charset GB18030-2022 is supported.
Original: 鿬
Encoded bytes: 82359633
Decoded: 鿬

CharsetSupportValidation.java代码如下

import java.nio.charset.Charset;
import java.nio.charset.UnsupportedCharsetException;

public class CharsetSupportValidation {
    public static void main(String[] args) {
        if (args.length != 2) {
            System.out.println("Usage: java CharsetSupportValidation <charset> <unicode>");
            return;
        }

        String charsetName = args[0];
        String testString = unescapeUnicode(args[1]);

        try {
            Charset charset = Charset.forName(charsetName);

            // 尝试编码和解码操作
            byte[] encodedBytes = testString.getBytes(charset);
            String decodedString = new String(encodedBytes, charset);

            System.out.println("Charset " + charsetName + " is supported.");
            System.out.println("Original: " + testString); // 原始字符串
            // 将字符串转为指定的charset字符集的编码
            System.out.println("Encoded bytes: " + bytesToHexString(decodedString.getBytes(charset))); 
            System.out.println("Decoded: " + decodedString); // 将字符串通过charset字符集编码后的字符串
        } catch (UnsupportedCharsetException e) {
            System.out.println("Charset " + charsetName + " is not supported.");
        }
    }

    // 将字节数组转换为十六进制字符串
    public static String bytesToHexString(byte[] bytes) {
        StringBuilder hexString = new StringBuilder();
        for (byte b : bytes) {
            String hex = Integer.toHexString(b & 0xFF);
            if (hex.length() == 1) {
                hexString.append('0'); // 确保两位十六进制表示
            }
            hexString.append(hex);
        }
        return hexString.toString();
    }

    // Convert Unicode escape sequence to character
    public static String unescapeUnicode(String input) {
        StringBuilder result = new StringBuilder();
        int length = input.length();
        for (int i = 0; i < length; i++) {
            char currentChar = input.charAt(i);
            if (currentChar == '\\' && i + 1 < length && input.charAt(i + 1) == 'u') {
                // Found a Unicode escape sequence
                String hexDigits = input.substring(i + 2, i + 6);
                char unicodeChar = (char) Integer.parseInt(hexDigits, 16);
                result.append(unicodeChar);
                i += 5; // Skip the rest of the escape sequence
            } else {
                result.append(currentChar);
            }
        }
        return result.toString();
    }
}

续:在unicode官方还发现一篇关于GB 18030-2022的征求意见稿,里面包含了目前发布的国家标准|GB 18030-2022 (samr.gov.cn)中未包含的一些字符