| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3304 人关注过本帖
标题:如何识别汉字和字母
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
當然沒那麼容易。正路是用內碼判別,而且不能用普通的substr()之類,必須用substrc()這種帶C的函數提取字符,最準確的辦法是瞭解編碼規則之後查表。

授人以渔,不授人以鱼。
2013-12-09 21:47
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
程序代码:
CLEAR ALL
CLEAR
cString = "1壹2貳叁ABC肆"
? "cString = " + cString
?
FOR nIndex = 1 TO LENC(cString)
    cChar = SUBSTRC(cString, nIndex, 1)
    ? PADR(cChar, 2) + " 是 " + IIF(ASC(cChar) > 255, "漢字字符", "西文字符")
NEXT
?
RETURN


授人以渔,不授人以鱼。
2013-12-09 22:35
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:2 
以下是引用TonyDeng在2013-12-9 22:35:59的发言:

 
CLEAR ALL
CLEAR
cString = "1壹2貳叁ABC肆"
? "cString = " + cString
?
FOR nIndex = 1 TO LENC(cString)
    cChar = SUBSTRC(cString, nIndex, 1)
    ? PADR(cChar, 2) + " 是 " + IIF(ASC(cChar) > 255, "漢字字符", "西文字符")
NEXT
?
RETURN
全角字符中的西文字符也会判断为汉字,必须用汉字字库判断。ABC

坚守VFP最后的阵地
2013-12-09 23:08
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
定義問題,全角的西文字符屬於漢字字符,傳統的西文字符就是ASCII編碼字符。

授人以渔,不授人以鱼。
2013-12-09 23:10
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
必须制定一个规则:汉字 字母 的规则各是什么标准。

坚守VFP最后的阵地
2013-12-09 23:11
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
沒有硬性的規定,所以說最好是查表,把那些特殊的字符歸類列表,創造自己的規則。

授人以渔,不授人以鱼。
2013-12-09 23:13
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
在以前沒有Unicode編碼的時候,使用ANSI編碼,這種識別字符的要求就很考人,許多程序員的精力都消耗在這裡,主要是無論什麼算法,都不可避免地要把識別工作從字符串的最開始逐個判斷,依次搜尋到目標字符處,才能知道當然字節到底是漢字的第一個字符還是第二個字符,一旦跳躍,就極容易出錯,這正是舊軟件經常出現亂碼的原因。後來C/C++標準才設定了wchar_t內置數據類型,專門處理雙字節的國際化字符,才使問題沒那麼嚴重,處理起來輕鬆得多,這就是VFP中那些帶C函數的版本。

看看我上面刻意設定的字符串就知道,中英夾雜,若用ANSI編碼,逐個字符看,若不從第一個字符讀起,在中間隨便抽一個字符出來,就可能落在漢字的前半或後半上,你無從知道是否需要提取下一個字符組成完整的漢字,一旦把後半視為前半,就是出亂碼的時候,要麼漢字錯位組成一團糨糊字符,要麼是把後面的英文字符夾在半個漢字後面。

[ 本帖最后由 TonyDeng 于 2013-12-9 23:47 编辑 ]

授人以渔,不授人以鱼。
2013-12-09 23:43
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
取最後一個字符的做法,也是錯的。對ANSI字符格式來說,漢字是2個字符,你取最後一個字符,函數當然返回那個漢字的後半個字節給你,這半個漢字仍然是1個字節長,你依這個結果來判斷是否漢字,當然是無法達到目的的。

授人以渔,不授人以鱼。
2013-12-09 23:49
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:109
帖 子:2214
专家分:3882
注 册:2007-4-27
收藏
得分:2 
len(aa)-lenc(aa) 的值是变量aa所含有的汉字个数

只求每天有一丁点儿的进步就可以了
2013-12-10 07:43
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:400
帖 子:11857
专家分:43421
注 册:2006-5-13
收藏
得分:0 
大家越讨论就越复杂,也许楼主仅仅是需要判定全角字符和半角字符,而不准确地表达成判断汉字和字母呢!

活到老,学到老!http://www.(该域名已经被ISP盗卖了)E-mail:hu-jj@
2013-12-10 07:54
快速回复:如何识别汉字和字母
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017060 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved