c++怎么判断汉字是简体还是繁体呢?

ybin225 2012-02-24 04:39:36
想用C++实现汉字简繁体的转换,但是不知道其中的原理和怎么判断,简体和繁体在计算机中怎么存储的?怎么才能实现转换?
...全文
1194 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
u011730237 2013-11-29
  • 打赏
  • 举报
回复
引用 12 楼 ybin225 的回复:
还是要使用字库吧?我最后还是找了个txt格式的字库的配置文件,读取这个配置文件,然后通过字库匹配;这样能应付我现在的需求 [Quote=引用 11 楼 llxxhm 的回复:] 我对这一块可是专门研究过的,很多年前还写过一个把台湾的繁体VFP工程的所有源码和数据库转为简体的工具 [/Quote]
可否把源码給我观察观察啊。。。
ybin225 2012-03-05
  • 打赏
  • 举报
回复
还是要使用字库吧?我最后还是找了个txt格式的字库的配置文件,读取这个配置文件,然后通过字库匹配;这样能应付我现在的需求
[Quote=引用 11 楼 llxxhm 的回复:]

我对这一块可是专门研究过的,很多年前还写过一个把台湾的繁体VFP工程的所有源码和数据库转为简体的工具
[/Quote]
QQ515311445 2012-03-03
  • 打赏
  • 举报
回复
我对这一块可是专门研究过的,很多年前还写过一个把台湾的繁体VFP工程的所有源码和数据库转为简体的工具
QQ515311445 2012-03-03
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ybin225 的回复:]
也就是说还是不确定正不正确,是不?

引用 5 楼 llxxhm 的回复:

引用 4 楼 llxxhm 的回复:
C/C++ code
long GetBig5Count(char *str)//如果此函数返回值大于零,则表明传入的字符串极可能是繁体
{
int lnBIG5 = 0;//用於統計可能是繁體字的漢字個數
int lnGB = 0;//用於統計可能是簡體字的漢字個……
[/Quote]
却是不一定准,但是文字越多越准,自己试下,这可是最终极的了,本来繁体和简体的编码就有重码区,不可能完全区分
muyi66 2012-02-24
  • 打赏
  • 举报
回复
UTF编码也有繁体字在里面的。其实里面大部分都是繁体字,反倒是简体字很少。
ybin225 2012-02-24
  • 打赏
  • 举报
回复
也就是说还是不确定正不正确,是不?
[Quote=引用 5 楼 llxxhm 的回复:]

引用 4 楼 llxxhm 的回复:
C/C++ code
long GetBig5Count(char *str)//如果此函数返回值大于零,则表明传入的字符串极可能是繁体
{
int lnBIG5 = 0;//用於統計可能是繁體字的漢字個數
int lnGB = 0;//用於統計可能是簡體字的漢字個數
int liTranLen = strlen(str);

for(int……
[/Quote]
ybin225 2012-02-24
  • 打赏
  • 举报
回复
怎么说“可能”或“极可能”?这是不是要看依赖于什么字库了?貌似不是那么简单
[Quote=引用 5 楼 llxxhm 的回复:]

引用 4 楼 llxxhm 的回复:
C/C++ code
long GetBig5Count(char *str)//如果此函数返回值大于零,则表明传入的字符串极可能是繁体
{
int lnBIG5 = 0;//用於統計可能是繁體字的漢字個數
int lnGB = 0;//用於統計可能是簡體字的漢字個數
int liTranLen = strlen(str);

for(int……
[/Quote]
gamecx 2012-02-24
  • 打赏
  • 举报
回复
专家不亏是专家,学习了
QQ515311445 2012-02-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 llxxhm 的回复:]
C/C++ code
long GetBig5Count(char *str)//如果此函数返回值大于零,则表明传入的字符串极可能是繁体
{
int lnBIG5 = 0;//用於統計可能是繁體字的漢字個數
int lnGB = 0;//用於統計可能是簡體字的漢字個數
int liTranLen = strlen(str);

for(int liT ……
[/Quote]
以上方法仅用于判断ANSII编码的字符串,大于零表明极可能是Big5编码,即繁体中文,否则可能是GB2132或者GBK,即简体中文
Unicode和UTF8编码的字符串是不需要判断的,国际通用.
QQ515311445 2012-02-24
  • 打赏
  • 举报
回复
long GetBig5Count(char *str)//如果此函数返回值大于零,则表明传入的字符串极可能是繁体
{
int lnBIG5 = 0;//用於統計可能是繁體字的漢字個數
int lnGB = 0;//用於統計可能是簡體字的漢字個數
int liTranLen = strlen(str);

for(int liT = 0; liT<liTranLen-1; liT++)
{
//尾字節40-7E是BGI5碼特有的,如果掃描到這種編碼說明此字元串是繁體(經測試:有例外,可能是漢字的最後一個編碼與英文編碼組合而成的)
if((BYTE)(BYTE)str[liT]>=161 && (BYTE)(BYTE)str[liT]<=254 && (BYTE)(BYTE)str[liT+1]>=64 && (BYTE)(BYTE)str[liT+1]<=126)
lnBIG5 ++;

//首字節A4-A9在GB中為日文假名,希臘字母,俄文字母和制表符,正常文本中很少出現,而這個範圍是BIG5的常用漢字,所以認為這是BIG5碼
if((BYTE)(BYTE)str[liT]>=164 && (BYTE)(BYTE)str[liT]<=169 && (BYTE)(BYTE)str[liT+1]>=161 && (BYTE)(BYTE)str[liT+1]<=254)
lnBIG5 ++;

//GB中首字節AA-AF沒有定義,所以首字節位於AA-AF之間,尾字節位於A1-FE的編碼幾乎100%是BIG5(經測試:沒有100%),認為是BIG5碼
if((BYTE)(BYTE)str[liT]>=170 && (BYTE)(BYTE)str[liT]<=175 && (BYTE)(BYTE)str[liT+1]>=161 && (BYTE)(BYTE)str[liT+1]<=254)
lnBIG5 ++;

//首字節C6-D7,尾字節A1-FE在GB中屬於一級字庫,是常用漢字,而在BIG5中,C6-C7沒有明確定義,但通常用來放日文假名和序號,C8-D7屬於罕用漢字區,所以可認為是GB碼
if((BYTE)(BYTE)str[liT]>=196 && (BYTE)(BYTE)str[liT]<=215 && (BYTE)(BYTE)str[liT+1]>=161 && (BYTE)(BYTE)str[liT+1]<=254)
lnGB ++;
}

//如果掃描完整個字元串,可能是簡體字的數目比可能是繁體字的數目多就認為是簡體字不轉簡(不一定准确)
return lnBIG5-lnGB;
}
ligen1123 2012-02-24
  • 打赏
  • 举报
回复
要看编码转换,,简体,用两个字节,,繁体就不知道了,,
看看,gb2312编码,,gb2312 编码只包含了6000多个汉字,,并不包含繁体,,

大陆是不用繁体,,台湾用繁体big5编码方式,,

如果gb2312可以转换成big5,,,如果不能,就直接查询编码转换表(一般都是采用二分查找)
gb2312在内存中存储,是用两个字节,,只存储,汉字的机内码,,高字节是区码,低字节是位码,
两字节码,拼起来就是汉字的机内码,,






七擒关羽 2012-02-24
  • 打赏
  • 举报
回复
编码不同吧,简体是UTF8,繁体好像是台湾的编码吧
luciferisnotsatan 2012-02-24
  • 打赏
  • 举报
回复
判断编码范围。具体的,请google。

65,020

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧