恼人的“龙天“(䶮)--谈谈从GBK转到GB18030的特殊情况

背景

最近在做一个去O迁移适配,刚好也有友商在一起做,两边测试方式不一样。友商先遇到了一个问题,就是在ORACLE中某个的2字节GBK字符到迁移到友商的库中变成了4字节,刚好那个字段在这个字是2字节的时候,已经存满了,转换成4字节后就会超长,死活都导不进去,经分析,是因为友商建库时选择了GB18030字符集,可是为什么2字节的GBK字符到了GB18030会变成4字节?而我在MogDB中建GBK的库,这个字能正常导入,不会超长。
这个字有何神奇之处?
在经过一些调查及测试验证后,特整理此文。

分析过程

这个字的外形是 ,上面是“龙”,下面是“天”。其实正常的输入法是可以输入这个外形的字的,但是,实际上你用输入法输入的这个字,并不是我上面提到的这个字,它们只是外形完全一样的“两个字”,这里我说“两个字”是对于unicode编码而言,或者换种说法,这个外形的字,在GB(GBK/GB18030)字符集的演进历史中,曾经占据了两个unicode编码,在windows中文区域里,使用ANSI时 ,这两个unicode编码的字符都可以正常显示字形。而在流行的UTF8编码的网页上,其中一个字可能是无法正常显示的,而这个字就是数据库迁移中存在问题的字,而这个字的起源,要追述到GBK编码定义


(https://www.zhihu.com/question/403694151)
如上图 右下角的位置,GBK+FE9F 这个编码,对应的unicode编码为U+E863,然后我们去查下unicode官网,找找这个编码,

在这里插入图片描述

在unicode官网里,这个编码并没有字形对应,而且该位置属于PUA(私人编码区)。

我们再来看GB18030-2022中U+E863是什么
在这里插入图片描述

U+E863对应的GB18030编码为 GB18030+8336CF39 ,此处也没有字形。也就是说,GBK编码的FE9F这个字,既不被UNICODE承认,也不在最新的国家强制标准GB18030-2022里。

可是,不是说GB18030比GBK能支持更多的生僻字么?其实,这个字并不是没有了,而是GB18030把它"直接兼容"了。

我们直接用GBK编码的FE9F在GB18030标准里找
在这里插入图片描述

可以看到这里的确有对应的字形,而且就是“龙天”,这个字对应的UNICODE编码为U+4DAE,于是我们再去UNICODE官网找找
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

果然在这里也能找到。

我们以UNICODE编码来整理一下这两个字的各种编码(由于这个字在UTF8中没有字形对应,所以可能部分网页上会显示方框,如果复制出来放到中国区域的windows的记事本里,就可以正常显示对应的字,因为当成GBK显示了)

UNICODE4DAEE863
UTF8E4B6AEEEA1A3
GB18030FE9F8336CF39
GBKFE9F

然后我测试了,在较新版本的ORACLE中,使用UTL_I18N里的raw_to_char/string_to_raw函数,也可以得到上述相同的结果

SQL> WITH T AS2  (SELECT UTL_I18N.RAW_TO_CHAR('4DAE','AL16UTF16') U4DAE ,3  UTL_I18N.RAW_TO_CHAR('E863','AL16UTF16') UE863 FROM DUAL)4  SELECT 'AL32UTF8' encoding, UTL_I18N.STRING_TO_RAW(U4DAE,'AL32UTF8') "4DAE",5  UTL_I18N.STRING_TO_RAW(UE863,'AL32UTF8') "E863" FROM T6  UNION ALL7  SELECT 'ZHS32GB18030',UTL_I18N.STRING_TO_RAW(U4DAE,'ZHS32GB18030'),8  UTL_I18N.STRING_TO_RAW(UE863,'ZHS32GB18030') FROM T9  UNION ALL10  SELECT 'ZHS16GBK',UTL_I18N.STRING_TO_RAW(U4DAE,'ZHS16GBK'),11  UTL_I18N.STRING_TO_RAW(UE863,'ZHS16GBK') FROM T;ENCODING     4DAE    E863
------------ ------- ---------
AL32UTF8     E4B6AE  EEA1A3
ZHS32GB18030 FE9F    8336CF39
ZHS16GBK     A3BF    FE9FSQL>

这里注意ORACLE中的 U+4DAE 在ZHS16GBK其实并不是 “A3BF”,而是因为并没有对应的字符,ORACLE把它转换成了全角问号(转成什么符号与当前环境的区域语言有关)。

引发的问题

所以,这里出现一个很尴尬的情况:
在去O过程中,原本在Oracle中使用的是GBK字符集,存入了GBK字符集支持的"FE9F"这个字符,如果迁移的目标库也是使用GBK字符集,那当然皆大欢喜。可是GBK目前已被国家标准废弃,必须要使用GB18030,而编码转换软件如果按照UNICODE标准进行转换,那么这个字将被转换成GB18030的"8336CF39" ,且不说数据可能会变长导致无法存入数据库,更大的问题是,GB18030中的"8336CF39"并没有对应的字形,会导致很多软件的UI无法显示这个字!

于是对于GBK和GB18030的转换,就不应该使用UNICODE的码点对应关系来进行转换了,这对于现有的绝大多数会涉及到文本转码的软件带来灾难。现有很多开发语言的内部都是默认使用的UTF8(比如JAVA、GO),各种字符的转入转出几乎都是通过UNICODE来进行中转,遇到这种转换的场景,很有可能会出现问题。相关报道有很多,这里随便列两篇:

1.# 谈困在系统里的生僻字,如何消除数字化“盲区”?

2.# 一个名字叫“䶮”的人的苦恼:开不了银行账户,用不了微信、支付宝

处理建议

  1. 对于软件开发商,转码软件或者转码模块应该单独编写GBK到GB18030的转码规则。比如本文的例子,GBK的 “FE9F” ,就应该映射到 GB18030的 “FE9F” ,而非通过UNICODE编码进行中转得到的 “8336CF39”;或者更新GBK的映射,使其unicode码和GB18030的映射关系一致(windows就是这么处理的 : windows-936-2000)
  2. 对于对被强制执行标准的软件用户,应提前采取措施应对GBK编码转到GB18030所带来的影响(原本用UTF8转到GB18030的没有此类问题),不是所有的软件开发商都会细致地去考虑编码转换问题,GB18030强制标准只要求能支持输入输出标准里的字符,并不要求支持和其他字符集进行转换。
  3. 对于所有的新软件开发,不应再使用GBK字符集,推荐使用UTF8(或者GB18030)
  • 本文作者: DarkAthena
  • 本文链接: https://www.darkathena.top/archives/longtian-yan-encoding-gbk-gb18030
  • 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/616251.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

国产六核CPU商显板,三屏异显,米尔基于全志D9360开发板

芯驰D9-Pro 自主可控、安全可信的高性能商显方案 采用国产CPU:集成了6个ARM Cortex-A551.6GHz 高性能CPU和1个ARM Cortex-R5800MHz; 高性能的高安全HSM安全的处理器,支持TRNG、AES、RSA、SHA、SM2/3/4/9; 它包含100GFLOPS 3D G…

屏幕截图编辑工具Snagit中文

Snagit是一款优秀的屏幕、文本和视频捕获与转换程序。它能够捕获屏幕、窗口、客户区窗口、最后一个激活的窗口或用鼠标定义的区域,并支持BMP、PCX、TIF、GIF或JPEG格式的保存。Snagit还具有自动缩放、颜色减少、单色转换、抖动等功能,并能将捕获的图像转…

[windows]一种判断exe是32位还是64位程序简单方法

不用运行,直接查看 exe 文件的兼容性属性。 如果是 32 位的程序,“简化的颜色模式”和“用 640x480 屏幕分辨率运行”是可以勾选的,且兼容模式最低可以调到 Windows 95。 而 64 位的程序,“简化的颜色模式”和“用 640 x 480 屏…

热过载继电器 WJJL1-05/2X AC220V 0.5A-5A 导轨安装 JOSEF约瑟

系列型号 WJJL1-10D/1过载保护器;WJJL1-50D/1过载保护器; WJJL1-100D/1过载保护器;WJJL1-300D/1过载保护器; WJJL1-600D/1过载保护器;WJJL1-1000D/1过载保护器; WJJL1-2000D/1过载保护器;WJ…

❤ Vue3 完整项目太白搭建 Vue3+Pinia+Vant3/ElementPlus+typerscript(一)yarn 版本控制 ltb (太白)

❤ 项目搭建 一、项目信息 Vue3 完整项目搭建 Vue3PiniaVant3/ElementPlustyperscript&#xff08;一&#xff09;yarn 版本控制 项目地址&#xff1a; 二、项目搭建 &#xff08;1&#xff09;创建项目 yarn create vite <ProjectName> --template vueyarn install …

FPGA开发设计

一、概述 FPGA是可编程逻辑器件的一种&#xff0c;本质上是一种高密度可编程逻辑器件。 FPGA的灵活性高、开发周期短、并行性高、具备可重构特性&#xff0c;是一种广泛应用的半定制电路。 FPGA的原理 采用基于SRAM工艺的查位表结构&#xff08;LUT&#xff09;&#xff0c;…

大创项目推荐 深度学习猫狗分类 - python opencv cnn

文章目录 0 前言1 课题背景2 使用CNN进行猫狗分类3 数据集处理4 神经网络的编写5 Tensorflow计算图的构建6 模型的训练和测试7 预测效果8 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习猫狗分类 ** 该项目较为新颖&a…

C#~Winform取消窗体最大化最小化按钮

目录 取消最大化-false取消最小化-false效果 取消最大化-false 取消最小化-false 效果

彻底解决charles抓包https乱码的问题

最近做js逆向&#xff0c;听说charles比浏览器抓包更好用&#xff0c;结果发现全是乱码&#xff0c;根本没法用。 然后查询网上水文&#xff1a;全部都是装证书&#xff0c;根本没用&#xff01; 最后终于找到解决办法&#xff0c;在这里记录一下&#xff1a; 乱码的根本原因…

Cmake 中的list介绍

这个链接非常好&#xff0c;都有例子。 https://www.jianshu.com/p/89fb01752d6f

AnyText多语言文字生成与编辑模型——让AI绘图自由添加精美文字

随着AIGC的爆火,图片生成技术得到飞速发展,当前AI生成的图片已达到真假难辨的高保真度。例如stable diffusion与midjourney为代表的文生图大模型。不过,当合成图片中出现文字内容时,现存的AI技术依然无法驾驭文字内容。因此,modescope提出了一种新型的文字生成方法,此方法…

矩阵的秩-

一、定义、理解 非零子式的最高阶数。 如何理解&#xff1f;什么叫做非零子式的最高阶数&#xff1f;&#xff1f;&#xff1f; 举个例子&#xff1a;有一个5阶矩阵 首先什么叫子式&#xff1f; 例如2阶子式就是&#xff0c;任取某两行某两列组成的行列式&#xff0c;就叫…

书生·浦语大模型实战营第三次课堂笔记

LLM 的局限性 知识时效性受限: 如何让LLM能够获取最新的知识 专业能力有限: 如何打造垂域大模型 定制化成本高: 如何打造个人专属的LLM应用 RAG:检索增强生成&#xff0c; 核心思想&#xff1a;给大模型外挂一个知识库&#xff0c;对于用户的提问&#xff0c;会首先从知识库中…

零基础入门,轻松制作仿真翻页电子书

​随着科技的进步&#xff0c;电子书已经成为越来越多人的选择。与传统纸质书籍相比&#xff0c;电子书具有便携性、可搜索性、可分享性等优势。然而&#xff0c;制作电子书并非易事。许多人都因为缺乏相关知识和技能而望而却步。我给大家提供了一些实用的方法哦&#xff0c;可…

字体包大小缩小的软件

Fontmin - 字体子集化方案https://ecomfe.github.io/fontmin/#app

openGauss学习笔记-195 openGauss 数据库运维-常见故障定位案例-分析查询语句运行状态

文章目录 openGauss学习笔记-195 openGauss 数据库运维-常见故障定位案例-分析查询语句运行状态195.1 分析查询语句运行状态195.1.1 问题现象195.1.2 处理办法 openGauss学习笔记-195 openGauss 数据库运维-常见故障定位案例-分析查询语句运行状态 195.1 分析查询语句运行状态…

什么软件可以做报表?

数据报表&#xff0c;是商业领域中不可或缺的一部分&#xff0c;它通过表格、图表等形式&#xff0c;将复杂的数据进行整理、分析并呈现出来&#xff0c;帮助用户更好地理解数据的趋势和关系。数据报表不仅展示了业务现状和趋势&#xff0c;还支持多种数据分析和挖掘功能&#…

代码随想录算法训练营第三天 | 203.移除链表元素、707.设计链表、206.反转链表

代码随想录算法训练营第三天 | 203.移除链表元素、707.设计链表、206.反转链表 文章目录 代码随想录算法训练营第三天 | 203.移除链表元素、707.设计链表、206.反转链表1 链表理论基础1.1 链表的定义1.2 链表的类型1.3 链表的存储方式1.4 链表的操作性能分析1.5 链表和数组的区…

使用Adobe Acrobat Pro DC给pdf文件填加水印

前言 GPT4的官方售价是每月20美元&#xff0c;很多人并不是天天用GPT&#xff0c;只是偶尔用一下。 如果调用官方的GPT4接口&#xff0c;就可以按使用量付费&#xff0c;用多少付多少&#xff0c;而且没有3个小时内只能提问50条的使用限制。 但是对很多人来说调用接口是比较麻烦…

使用new pm写一个pass

范例来自LLVM Techniques, Tips, and Best Practices Clang and Middle-End Libraries llvm ir到ir是由一个个pass处理的&#xff0c;从一个ir到另一个ir会改变一些东西 书里面就是说想要给指针变量添加一个noalias属性 书里面使用插件的形式&#xff0c;但是不知道怎么我搞不…