CVCode简繁转换的扩展:GBK与Big5转换
CVCode使用码表对照的方式实现简繁转换,在Unicode盛行的今天仍然是有其现实意义的。
较常见的应用是,企业内有台籍员工,也有大陆员工,而且简体和繁体的OS都有使用,这样在MIS系统中如何保证GB2312、GBK、BIG5都能够正常
CVCode使用码表对照的方式实现简繁转换,在Unicode盛行的今天仍然是有其现实意义的。
较常见的应用是,企业内有台籍员工,也有大陆员工,而且简体和繁体的OS都有使用,这样在MIS系统中如何保证GB2312、GBK、BIG5都能够正常使用,而且BIG5输入的资料在GBK的系统上要显示正常,并且能与GB2312中输入的字符相匹配(查询中,按名称查询是最常见的)。
针对这样的应用,CVCode就提供码表对照的方式,理论上讲,只要定义好码表,就可以真正的让BIG5与GB2312“互通”
但是在CVCode中,只是GB2312与BIG5转换,在GBK输入法流行的今天,GB2312显然不够了。而且BIG5字符集要远远大于GB2312,所以扩展CVCode使其具有GBK与BIG5转换功能势在必行。
GBK的字符范围如下:
GBK字符集范围
分区 高位 低位<
----------------------------------------------
●GBK/1:GB2312非汉字符号: A1~A9 || A1~FE
●GBK/2:GB2312汉字 : B0~F7 || A1~FE
●GBK/3:扩充汉字 : 81~A0 || 40~FE
●GBK/4:扩充汉字 : AA~FE || 40~A0
●GBK/5:扩充非汉字 : A8~A9 || 40~A0
其中1和2就是对应的GB2312字符集。
如何让CVcode支持GBK,有3个问题:
1.判断是否GB码
2.计算字符顺序
3.与原有码表兼容
第一个问题就要修改IsGB如下:
function isGB(value: string): Boolean;
Var
mHigh, mLow : integer;
begin
if (length(value)>=2) then
begin
mHigh := ord(value[1]);
mLow := ord(value[2]);
Result := False;
//●GBK/1:GB2312非汉字符号: A1~A9 || A1~FE
if (mHigh in [$A1..$A9]) and (mLow in [$A1..$FE]) then Result := True;
//●GBK/2:GB2312汉字 : B0~F7 || A1~FE
if (mHigh in [$B0..$F7]) and (mLow in [$A1..$FE]) then Result := True;
//●GBK/3:扩充汉字 : 81~A0 || 40~FE
if (mHigh in [$81..$A0]) and (mLow in [$40..$FE]) then Result := True;
//●GBK/4:扩充汉字 : AA~FE || 40~A0
if (mHigh in [$AA..$FE]) and (mLow in [$40..$A0]) then Result := True;
//●GBK/5:扩充非汉字 : A8~A9 || 40~A0
if (mHigh in [$A8..$A9]) and (mLow in [$40..$A0]) then Result := True;
end
else
Result := true;
{ //这是原来的,只以GB2312为判断依据
if (length(value)>=2) then
begin
if (value[1] <= #161) and (value[1] >= #247) then
Result := false
else
if (value[2] <= #161) and (value[2] >= #254) then
Result := false
else
Result := true
end
else
Result := true;
}
end;
第二个要计算顺序和与原有码表兼容---其实兼容主要也在顺序:
function GBOffset(value: string): integer;
Var
mHigh, mLow : integer;
mGBK1, mGBK2, mGBK3, mGBK4, mGBK5: integer;
begin
{ //这是原来的---
if length(value) >= 2 then
Result := (Ord(value[1]) - $A1) * $5E + (Ord(value[2]) - $A1)
else
Result := -1;
}
Result := -1;
if length(value) >= 2 then
begin
mHigh := ord(value[1]);
mLow := ord(value[2]);
//每个区都有多少个汉字?
//mGBK1 := ($A9 - $A1 + 1) * ($FE - $A1 + 1); // = 846 = $34E
//mGBK2 := ($F7 - $B0 + 1) * ($FE - $A1 + 1); // = 6768 = $1A70
//mGBK3 := ($A0 - $81 + 1) * ($FE - $40 + 1);
//mGBK4 := ($FE - $AA + 1) * ($A0 - $40 + 1);
//mGBK5 := ($A9 - $A8 + 1) * ($A0 - $40 + 1);
mGBK1 := $34E; //846
mGBK1 := mGBK1 + ($B0 - $A9-1) * ($FE - $A1 + 1); //这个是为了和以前的码表兼容
mGBK2 := $1A70; //6768
mGBK3 := $17E0; //6112
mGBK4 := $2035; //8245
mGBK5 := $C2; //194
//●GBK/1:GB2312非汉字符号: A1~A9 || A1~FE
if (mHigh in [$A1..$A9]) and (mLow in [$A1..$FE]) then
Result := (mHigh - $A1) * ($FE - $A1 + 1) + (mLow - $A1)
//●GBK/2:GB2312汉字 : B0~F7 || A1~FE
else if (mHigh in [$B0..$F7]) and (mLow in [$A1..$FE]) then
Result := mGBK1 +
(mHigh - $B0) * ($FE - $A1 + 1) + (mLow - $A1)
//●GBK/3:扩充汉字 : 81~A0 || 40~FE
else if (mHigh in [$81..$A0]) and (mLow in [$40..$FE]) then
Result := mGBK1 + mGBK2 +
(mHigh - $81) * ($FE - $40 + 1) + (mLow - $40)
//●GBK/4:扩充汉字 : AA~FE || 40~A0
else if (mHigh in [$AA..$FE]) and (mLow in [$40..$A0]) then
Result := mGBK1 + mGBK2 + mGBK3 +
(mHigh - $AA) * ($A0 - $40 + 1) + (mLow - $40)
//●GBK/5:扩充非汉字 : A8~A9 || 40~A0
else if (mHigh in [$A8..$A9]) and (mLow in [$40..$A0]) then
Result := mGBK1 + mGBK2 + mGBK3 + mGBK4 +
(mHigh - $A8) * ($A0 - $40 + 1) + (mLow - $40);
end
end;
CVCode简繁转换的扩展:GBK与Big5转换相关推荐
- mysql编码转换工具_MySQL GBK→UTF-8编码转换
MySQL GBK→UTF-8编码转换 2021-01-23 11:20:21483 前言: 第一次写教程,其实算不得教程,只是想总结个转换的手记.如果中间有错误,或者办法不够理想,大家回贴研究下. ...
- VC----实现汉字简繁转换
转载请注明出处:http://blog.csdn.net/yf210yf/article/details/7850472 繁体为什么分为乱码和非乱码的.现在总算搞清楚了 看起来是乱码那种叫Big5,非 ...
- php - 简繁转换
FROM: http://justcoding.iteye.com/blog/593782 均只支持 UTF8 文本,所以如果获得的来源是 $_GET 的话, 就有必要转换一下编码了.用到的函数是: ...
- 网站实时简繁转换解决方案
最近由于工作需要做了一个将网站转成繁体呈现给用户的功能,后来参看了许多成功案例,发现思路大体都是相同的,我现在将我具体的实现拿出来讨论一下,因为它不可能是一个百分百覆盖的功能,所以希望大家能多提意见. ...
- NLP之TEA:基于SnowNLP实现自然语言处理之对输入文本进行情感分析(分词→词性标注→拼音简繁转换→情感分析→测试)
NLP之TEA:基于SnowNLP实现自然语言处理之对输入文本进行情感分析(分词→词性标注→拼音&简繁转换→情感分析→测试) 目录 NLP分词 NLP词性标注 NLP情感分析-TEA NLP常 ...
- HanLP极致简繁转换详细讲解
HanLP极致简繁转换详细讲解 谈起简繁转换,许多人以为是小意思,按字转换就行了.事实上,汉语历史悠久,地域复杂,发展至今在字符级别存在"一简对多繁"和"一繁对多简&qu ...
- gbk编码在线转换工具_TOOLFK工具-在线汉字/字母/人民币/简繁体转换工具
本文要推荐的[TOOLFK]在线汉字/字母/人民币/简繁体转换工具,提供简繁体在线转换.人民币大写转换.字母大小写互转.汉字转拼音在线日常使用工具. 網站名稱:ToolFk 網站鏈結:https:// ...
- SQL Server:简繁转换
代码 --全部的简繁对照 declare @jall nvarchar(4000),@fall nvarchar(4000) select @jall=N'啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸 ...
- java utf8 简繁转换 类库_在Java中进行中文繁体简体转换,基于OpenCC(Open Chinese Convert)方案...
一.OpenCC介绍 OpenCC (Open Chinese Convert,开放中文转换) 是一个用于中文简繁转换的开源项目,支持词汇级别的转换.异体字转换和地区习惯用词转换(中国大陆.台湾.香港 ...
最新文章
- 2019年Java程序员就业分析
- cv2.setNumThreads
- 开放寻址法VS链表法
- pip3 install requests Cannot open D:\Python35\Scripts\pip3-script.py
- 达梦数据库导入oracle数据_达梦数据库和oracle数据的一些区别
- In aggregated query without GROUP BY, expression #2 of SELECT list contains nonaggregated column...
- python纵向数据分析_python数据分析三个重要方法之:numpy和pandas
- SuSE 11 安装mysql 5.6.35步骤
- 关于IT结合测试,事前DB与事后DB的问题(之一:如何能更好的看出更新效果)。
- BURP安装Turbo Intruder插件报错问题
- vue 停止页面滚动_Vue关于滚动停止的监听方法
- ChatGPT的注册和使用教程
- 合肥工业大学机器人技术实验五十六题
- Clickhouse 踩坑之旅 ---- MergeTree不合并分区的问题
- esp32➡遥控篇➡turtlesim➡mobot➡turtlebot3
- BCB数据库问题总结
- 【Cornerstone Mac系统下的安装】
- oracle调优 oracle培训
- 【新浪面试题】如何技高一筹解决查找单链表中的倒数第k个结点
- s15.一键安装java脚本