回 帖 发 新 帖 刷新版面

主题:编程小贴示:返回汉字串的拼音码

*****************************
*程序名称: ZBHZ2PY.PRG
*功    能: 返回汉字串的拼音码
*调用方式: PYM=ZBHZ2PY(HZ,LEN)
*编    制: (2001.09.18)
*****************************
PARAMETERS TMP_HZ,TMP_SLEN
PRIVATE ALL LIKE TMP_*
IF PARAMETERS()=0
   RETURN ""
ENDIF
TMP_FLAG=.T.
IF PARAMETERS()=1
   TMP_FLAG=.F.
ENDIF
TMP_HZ=STRTRAN(TMP_HZ," ")
TMP_LEN=LEN(TMP_HZ)
TMP_NHZ=""
FOR TMP_I=1 TO TMP_LEN
    TMP_DZ=SUBSTR(TMP_HZ,TMP_I,1)
    IF ASC(TMP_DZ)>160
       TMP_NHZ=TMP_NHZ+TMP_DZ
    ENDIF
ENDFOR
TMP_HZ=TMP_NHZ
TMP_HZS=LEN(TMP_HZ)/2
TMP_PY=""
FOR TMP_I=1 TO TMP_HZS
    TMP_DZ=SUBSTR(TMP_HZ,(TMP_I-1)*2+1,2)
    TMP_PY=TMP_PY+ZBDZ2PY(TMP_DZ)
ENDFOR
IF TMP_FLAG
   TMP_PY=PADR(TMP_PY,TMP_SLEN,"*")
ENDIF
RETURN TMP_PY

回复列表 (共14个回复)

沙发

*****************************
*程序名称: ZBDZ2PY.PRG
*功    能: 返回汉字的拼音码
*调用方式: PYM=ZBDZ2PY(HZ)
*编    制: (2004.03.18)
*****************************
PARAMETERS TMP_DZ
PRIVATE ALL LIKE TMP_*
IF PARAMETERS()=0
   RETURN ""
ENDIF
TMP_NN=(ASC(LEFT(TMP_DZ,1))-160)*100+ASC(RIGHT(TMP_DZ,1))-160
DO CASE
   CASE TMP_NN>=1601 .AND. TMP_NN<=1636
        TMP_CC="A"
   CASE TMP_NN>=1637 .AND. TMP_NN<=1832
        TMP_CC="B"
   CASE TMP_NN>=1833 .AND. TMP_NN<=2077
        TMP_CC="C"
*       IF TMP_NN>=1857 .AND. TMP_NN<=2034
*          TMP_CC="CH"
*       ENDIF
   CASE TMP_NN>=2078 .AND. TMP_NN<=2273
        TMP_CC="D"
   CASE TMP_NN>=2274 .AND. TMP_NN<=2301
        TMP_CC="E"
   CASE TMP_NN>=2302 .AND. TMP_NN<=2432
        TMP_CC="F"
   CASE TMP_NN>=2433 .AND. TMP_NN<=2593
        TMP_CC="G"
   CASE TMP_NN>=2594 .AND. TMP_NN<=2786
        TMP_CC="H"
   CASE TMP_NN>=2787 .AND. TMP_NN<=3105
        TMP_CC="J"
   CASE TMP_NN>=3106 .AND. TMP_NN<=3211
        TMP_CC="K"
   CASE TMP_NN>=3212 .AND. TMP_NN<=3471
        TMP_CC="L"
   CASE TMP_NN>=3472 .AND. TMP_NN<=3634
        TMP_CC="M"
   CASE TMP_NN>=3635 .AND. TMP_NN<=3721
        TMP_CC="N"
   CASE TMP_NN>=3722 .AND. TMP_NN<=3729
        TMP_CC="O"
   CASE TMP_NN>=3730 .AND. TMP_NN<=3857
        TMP_CC="P"
   CASE TMP_NN>=3858 .AND. TMP_NN<=4026
        TMP_CC="Q"
   CASE TMP_NN>=4027 .AND. TMP_NN<=4085
        TMP_CC="R"
   CASE TMP_NN>=4086 .AND. TMP_NN<=4389
        TMP_CC="S"
*       IF TMP_NN>=4115 .AND. TMP_NN<=4324
*          TMP_CC="SH"
*       ENDIF
   CASE TMP_NN>=4390 .AND. TMP_NN<=4557
        TMP_CC="T"
   CASE TMP_NN>=4558 .AND. TMP_NN<=4683
        TMP_CC="W"
   CASE TMP_NN>=4684 .AND. TMP_NN<=4924
        TMP_CC="X"
   CASE TMP_NN>=4925 .AND. TMP_NN<=5248
        TMP_CC="Y"
   CASE TMP_NN>=5249 .AND. TMP_NN<=5589
        TMP_CC="Z"
*       IF TMP_NN>=5290 .AND. TMP_NN<=5539
*          TMP_CC="ZH"
*       ENDIF
   OTHERWISE
        TMP_CC="?"
ENDCASE
DO CASE
   CASE TMP_DZ$"/婵/"
        TMP_CC="C"
   CASE TMP_DZ$"/窦/邸/棣/"
        TMP_CC="D"
   CASE TMP_DZ$"/泓/晖/"
        TMP_CC="H"
   CASE TMP_DZ$"/琨/侃/"
        TMP_CC="K"
   CASE TMP_DZ$"/苓/岚/翎/逯/徕/奕/"
        TMP_CC="L"
   CASE TMP_DZ$"/琦/麒/琪/"
        TMP_CC="Q"
   CASE TMP_DZ$"/佟/"
        TMP_CC="T"
   CASE TMP_DZ$"/玮/"
        TMP_CC="W"
   CASE TMP_DZ$"/钊/翟/"
        TMP_CC="Z"
   CASE TMP_DZ$"/闫/馀/"
        TMP_CC="Y"
ENDCASE
RETURN TMP_CC

板凳

第一段需要调用第二段
如果在使用中,发现“?”字,可在第二段中修改
我单位500人中,只有这几个较为偏僻的字

3 楼

支持!希望多发!

4 楼

谢谢楼上对我的鼓励。
我来此论坛的目的就是希望我们大家对VFP相关知识共同学习、共同提高!

5 楼

我这里有一本张洪举的书,我把他的代码发上来大家看看.

Parameter cHzchr
local cPychr,i,j,C,Hz
cPychr=""
set collate to "PINYIN"
PYcode="八嚓咑妸发旮铪讥讥咔垃呣拿讴趴七呥仨他哇哇哇夕丫匝咗"
for i=1 to len(cHzchr)
    if asc(substr(cHzchr,i,1))>160
       Hz=substr(cHzchr,i,2)
       C=""
       for j=1 to 26
           if substrC(Hz,1,1)<substrc(PYcode,j,1)
              C=chr(96+j)
              exit
           endif
       endfor
       cPYchr=cPYchr+upper(C)
       i=i+1
    else
       cPYchr=cPYchr+upper(substr(cHZchr,i,1))
    endif
endfor
return cPYchr

6 楼

楼主的程序和MOZ的程序都测试过了,都不错.MOZ的程序更简练些,且不会有"生僻"字的问题,但对像~!·¥……—()——|字符不能给出原字符,而是全部给“A”,所以,对MOZ的程序稍作改动如下:
Parameter cHzchr
local cPychr,i,j,C,Hz
cPychr=""
set collate to "PINYIN"
PYcode="八嚓咑妸发旮铪讥讥咔垃呣拿讴趴七呥仨他哇哇哇夕丫匝咗"
for i=1 to lenc(cHzchr)
    Hz=substrc(cHzchr,i,1)
    if asc(Hz) > 45119
       for j=1 to 26
           if substrC(Hz,1,1)<substrc(PYcode,j,1)
              C=chr(96+j)
              exit
           endif
       endfor
       cPYchr=cPYchr+upper(C)
    else
       cPYchr=cPYchr+upper(substrc(cHZchr,i,1))
    endif
endfor
retu cPYchr
-----------------------------------------------------------------
生成汉字串的拼音码有什么用处,相信楼主做过研究,能不能详告。

7 楼

1.程序是张洪举写的,不是我写的
2.原程序可以识别字母与半角符号
3.在很多应用到姓名或名称查询的时候:(特别是电话查询的时候)
  你叫什么名字? 我帮你查一下.
  我叫(金龙高/今隆糕/进笼告)?
  到底是哪个呢?怎么查呢?
  查询筛选  JLG  就可以了.

8 楼

譬如要查询金龙高,只要输入"JLG"就可以,然后用:
set filter to 'JLG'$HztoPy(姓名)
将所有姓名的拼音码为"JLG"的记录筛选出来供用户查看.
或者用:
select * from 表 where 'JLG'$HztoPy(姓名)查询所有姓名的拼音码为"JLG"的记录.
是这样应用吗?
--------------------------------------
注: HztoPy()为拼音码生成函数.

9 楼

丝嘀丝嘀

10 楼

今天闲着无事,又把老贴翻出,并由此想到一个问题,我用:
set filter to 'JLG'$HztoPy(姓名)
很方便地实现了快速查找问题,但新的问题又出现了,当源数据表记录过多时,在表单的表格中,上下移动一行或若干行时,发现有一个反应迟滞的问题,经研究,感觉好像是每移动一行时,上述筛选操作就要被系统执行一次.
所以,我的问题产生了:
1、是不是表格显示出来的内容发生变化时,系统是否会重新执行一次筛选操作?
2、如果是,如何避免?

我来回复

您尚未登录,请登录后再回复。点此登录或注册