标题:如何批量地将双字节(全角)字母转换为单字节的(半角)字母
只看楼主
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
?CHRTRANC([ABCD,。EFG],[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz],[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz])

坚守VFP最后的阵地
2013-01-08 16:33
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
你不动那些不需要动的内容,当然没问题了,但你这个还是在需要增删内容的时候不方便,特别是牵涉到引起字符串标识符的符号时,到时那代码很难看了。

授人以渔,不授人以鱼。
2013-01-08 16:38
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:0 
程序代码:
*---生成全角、半角字母表:A~Z的ASC码为41921-41946,a~z的ASC码为41953-41978
CLEAR
CREATE CURSOR LSB (全角 C(2),半角 C(1))
A=[AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZaabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz]
FOR I=1 TO 104
    IF MOD(I,2)=1
       A1=SUBSTRC(A,I,1)
    ELSE
       A2=SUBSTRC(A,I,1)
       INSERT INTO LSB VALUES (A1,A2)
    ENDIF
ENDFOR
CREATE CURSOR TABNAME (T C(40),T1 C(40))
INSERT INTO TABNAME VALUES ([Fidelity(大连)商务服务有限公司],[])
INSERT INTO TABNAME VALUES ([FIL(大连)科技有限公司],[])
SCAN
   B=ALLTRIM(T)
   FOR I=1 TO LENC(B)
       IF BETWEEN(ASC(SUBSTRC(B,I,1)),41921,41946) OR BETWEEN(ASC(SUBSTRC(B,I,1)),41953,41978)
          SELECT 半角 FROM LSB WHERE 全角==SUBSTRC(B,I,1) INTO ARRAY BJ
          B=CHRTRANC(B,SUBSTRC(B,I,1),BJ)
       ENDIF
   ENDFOR
   SELECT TABNAME
   REPLACE T1 WITH B
ENDSCAN
BROWSE
这样应该保险了吧

坚守VFP最后的阵地
2013-01-08 17:07
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
得分:0 
知道原理,怎么写都可以的了。

授人以渔,不授人以鱼。
2013-01-08 17:13
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:396
帖 子:11713
专家分:43267
注 册:2006-5-13
得分:0 
以下是引用tlliqi在2013-1-7 20:58:23的发言:

upda 表 set 字段=lower(字段)
这应该是转换为小写字母,而不是全角转换成半角。

活到老,学到老! http://www. E-mail:hu-jj@
2013-01-08 19:50
taifu945
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:80
帖 子:1545
专家分:3298
注 册:2012-7-6
得分:0 
程序代码:
CLOSE ALL
SET SAFETY OFF

USE T1
SCAN
   ZZ=""
   FOR I=1 TO LENC(ALLTRIM(MC))
      ASC_MC=ASC(SUBSTRC(MC,I,1))
      IF BETWEEN(ASC_MC,41921,41946) OR ;
         BETWEEN(ASC_MC,41953,41978)
         ZZ=ZZ-CHR(ASC_MC-41856)  &&减去全角字母和半角字母的ASCII码之差
      ELSE
         ZZ=ZZ-SUBSTRC(MC,I,1)
      ENDIF
   NEXT
   REPLACE MC WITH ZZ
ENDSCAN

CLOSE ALL
SET SAFETY ON


2013-01-08 21:38



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-395663-1-1.html




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

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