[LISP]怎么样判断汉字?
<P>如题:例 (setq strA "汉字") (setq strB "HanZi")</P><P>请问怎么判断 strA 为汉字 strB不为汉字??</P>
<P>谢谢.....</P> <P>ASCII 码 <BR>27 ESC 32 SPACE 33 ! 34 " <BR>35 # 36 $ 37 % 38 & <BR>39 ' 40 ( 41 ) 42 * <BR>43 + 44 ' 45 - 46 . <BR>47 / 48 0 49 1 50 2 <BR>51 3 52 4 53 5 54 6 <BR>55 7 56 8 57 9 58 : <BR>59 ; 60 < 61 = 62 > <BR>63 ? 64 @ 65 A 66 B <BR>67 C 68 D 69 E 70 F <BR>71 G 72 H 73 I 74 J <BR>75 K 76 L 77 M 78 N <BR>79 O 80 P 81 Q 82 R <BR>83 S 84 T 85 U 86 V <BR>87 W 88 X 89 Y 90 Z <BR>91 [ 92 \ 93 ] 94 ^ <BR>95 _ 96 ` 97 a 98 b <BR>99 c 100 d 101 e 102 f <BR>103 g 104 h 105 i 106 j <BR>107 k 108 l 109 m 110 n <BR>111 o 112 p 113 q 114 r <BR>115 s 116 t 117 u 118 v <BR>119 w 120 x 121 y 122 z <BR>123 { 124 | 125 } 126 ~</P>
<P>以上为各种字符的ASCII码,用ASCII函数遍历字符串中的每个字符,如果其值超出这个范围的即为汉字,当然还有可能为其他文字,如日文等,汉字的ASCII码好象有一个专门的范围,分什么区位码,没研究过.</P> <P>(if (> (ascii str) 160)</P>
<P> 汉字</P>
<P> </P> (ascii "δ") →166 (ascii "★") →161 (ascii "≈") →161 (ascii "→") →161 (ascii "э") →167显然这5个不是汉字 为什么不是128呢???我怀疑是128呢,但没有证据............ 就是128了! <P>这个问题说起来比较复杂,在计算中,一个字符用一个八为二进制表示,称为一个字节.共有256个状态.前128个已经定义为标准的ASCII码.</P>
<P>后128后用语非拉丁系双字节模式.如中文\日文\韩文等,一般用两个字节表示一个字.</P>
<P>在汉字系统中,汉字及其各种双字节符号由两个大于160的扩充ASCII码表示,为了表示方便.用第一个字节的ASCII码减去160称为区码,用第二个字节的ASCII码减去160称为位码,</P>
<P>区码和位码各有94个.</P>
<P>汉字系统的分区中,第一区表示标准的标点符号,第二区是各种序号,第三区是标准ASCII玛,第六区是西腊字母,第九区是制表符.</P>
<P>大于16区以上为汉字区.</P>
<P>故判断方法是:</P>
<P>(if (> (asscii str) 175)</P>
<P> 汉字</P>
<P> </P> <P>(Defun C:test ()<BR> (setq str "在汉字系统中汉字及其各种双字节符号由两个大于的扩充码表示为了表示方便用第一个字节的码减去称为区码用第二个字节的码减去称为位码")<BR> (setq i 1)<BR> (repeat (fix (* (strlen str) 0.5))<BR> (setq code (substr str i 2)<BR> i (+ 2 i)<BR> )<BR> (princ "\n")<BR> (princ code)<BR> (princ " ---------- ")<BR> (princ (ascii code))<BR> )<BR> (prin1)<BR>)</P>
<P>确实没有小于 175 的,</P>
<P>谢谢 <A name=20674><FONT color=#000066><B>wzz1968</B></FONT></A></P>
<P>请问 <A name=20674><FONT color=#000066><B>wzz1968</B></FONT></A> 大侠 你是怎么知道这个东西的啊,哪里的资料,</P>
<P><A name=20674><FONT color=#000066><B></B></FONT></A> </P> <P>回答楼上的:</P>
<P>这是非常基础的计算知识.现在估计找不到这样的资料了,能说清楚这个人也不多.</P>
<P> </P> (Defun C:test ()
(setqstr (getstring " 输入需要判断ASCII码的字符:"))
(setq i 1)
(repeat (fix (* (strlen str) 0.5))
(setq code (substr str i 2)
i (+ 2 i)
)
(princ "\n")
(princ code)
(princ "---------- ")
(princ (ascii code))
)
(prin1)
)
略作修改,这样更方便查看
页:
[1]
2