+ -
当前位置:首页 → 问答吧 → foxpro 中文字问题

foxpro 中文字问题

时间:2014-05-17

来源:互联网

大家好,小弟有个问题想请教高手。
我有一个字串,里面有数目字和中文字元。例如例1aa= 'cd国a一b123国'例2aa= 'aa国国国国一123'例3aa= 'c国dab一123国'
而我想将以上字串分成两行,於第五或第六个字开始转行,但以上字串中的第五个字开始,可能会有英文或中文,请问点先可以认到个个位系中文字既开首??

我试过用isleadbyte(substr,5,2)),例1可以认到个个唔系中文字但例2因为第五个字元系「国」字既左字,用isleadbyte佢都系传回T,所以如果我照於第五个字转行,转行会出现乱码。
请问有咩办法可以辨定所选字系咪一个完整既中文字??

作者: hkhome   发布时间: 2014-05-17

try

isalpha(substr(1aa,5,1)).or.isdigit(substr(1aa,5,1)) 检查英文字和数字

[ 本帖最后由 me888 於 2014-4-22 03:50 PM 编辑 ]

作者: me888   发布时间: 2014-05-17

hihi me888,谢谢你的回覆

我试过isalpha("国"),佢回传都系ture...

作者: hkhome   发布时间: 2014-05-17

一个中文字好似等於2个chars, 所以你试下检查, 例如"国"字,先将中文字拆开1,2char,再检查1,2 char ASCII 是否小於128, 睇下得唔得。如无记错一个中文字1,2 char 都系ascii 大过128.睇下得唔得,唔得就等高手解答囉。

[ 本帖最后由 me888 於 2014-4-22 06:28 PM 使用 编辑 ]

作者: me888   发布时间: 2014-05-17

汪汪只系识C++
如果个程式没有预设处理中文字的library

可以查编码的
例如UTF-8
ASCII字元会用一个char(1-byte)来保存
0zzzzzzz <---第一个bit必定为0....而后7个bit用来表示ASCII字元

非ASCII字元就会使用上二至四个char
第一个char的可以指示出之后连续有几多个char都属於这个非ASCII字元

110yyyyy 10zzzzzz <---第一个char以110开头...表示这个字元会使用上两个char
1110xxxx 10yyyyyy 10zzzzzz <---第一个char以1110开头...表示这个字元会使用上三个char
11110www 10xxxxxx 10yyyyyy 10zzzzzz <---第一个char以11110开头...表示这个字元会使用上四个char

作者: Susan﹏汪汪   发布时间: 2014-05-17

hi hkhome,

以前也遇过同样问题,依赖foxpro build in function 未必能解决,解决方法正如 me888 和 susan 所言。但首先要确定用什么编码,没有记错的话,foxpro 好像预设是 big5。但我很外久没接触 foxpro 了,你还是自行确认一下。

作者: assembly.jc   发布时间: 2014-05-17

我怀疑唔出乱码, in general case, 理论上一定要从byte one开始check,
唔可能由中间睇, 认到一粒中文字而唔会中间意外切成半粒中文字.

作者: 111x111=12321   发布时间: 2014-05-17

E.g. '国' = chr(176)+chr(234)
而 '穈' = chr(234)+chr(176)

当中间有字串 ...ABAB..
你系唔能够确实佢来自 ABABABAB (ABAB是正字) 或 BABABABA (ABAB是乱码).

Is it ...国国国国国... or ...穈穈穈穈穈...
难为国穈定分界.

作者: 111x111=12321   发布时间: 2014-05-17

引用:原帖由 111x111=12321 於 2014-4-23 10:14 PM 发表
E.g. '国' = chr(176)+chr(234)
而 '穈' = chr(234)+chr(176)

当中间有字串 ...ABAB..
你系唔能够确实佢来自 ABABABAB (ABAB是正字) 或 BABABABA (ABAB是乱码).

Is it ...国国国国国... or ...穈穈穈穈穈. ...
分到

以UTF-8为例
有两种format去表示字元

第一种系用单一码表示:000wwwxx xxxxyyyy yyzzzzzz
这格式下所有字元都一样会占据3 bytes

第二种系编码成byte array方式
#5已经解释左、针对不同字元会使用不定长度的值
会使用到不同的标签

作者: Susan﹏汪汪   发布时间: 2014-05-17

引用:原帖由 Susan﹏汪汪 於 2014-4-23 10:46 PM 发表

分到

以UTF-8为例
有两种format去表示字元

第一种系用单一码表示:000wwwxx xxxxyyyy yyzzzzzz
这格式下所有字元都一样会占据3 bytes

第二种系编码成byte array方式
#5已经解释左、针对不同字元会使用不定长度的 ...
讲紧foxpro喎.

我例子已列出, 是big5,
你应该先同意 :「系呀, big5分唔到..... 第二d内码先有机会分到, 例如...」

作者: 111x111=12321   发布时间: 2014-05-17

引用:原帖由 hkhome 於 2014-4-22 02:03 PM 发表
大家好,小弟有个问题想请教高手。
我有一个字串,里面有数目字和中文字元。例如例1aa= 'cd国a一b123国'例2aa= 'aa国国国国一123'例3aa= 'c国dab一123国'
而我想将以上字串分成两行,於第五或第六个字开始转行,但 ...
我估要由整串 string 第一个“字”开始 check ,确定每一个“字”正常才考虑下一或两个 byte (如果是 big5 码)。
不过实际要如何 check ,就不知道了。
或者会有 library 。

约略看过 http://zh.wikipedia.org/wiki/%E5%A4%A7%E4%BA%94%E7%A2%BC 后,我觉得似乎“无得搞”。

作者: xianrenb   发布时间: 2014-05-17

foxpro 系big5。
首先多谢各位师兄的回答。
aa = '国国'
我试过asc(aa,2,1)佢都系大过127,似乎未能确定个个字系byte one定byte tow。

我个串字元有三百几字,当中夹杂好多不规则既数目同中文,而要每164至170至转行。
真系头都大埋...

作者: hkhome   发布时间: 2014-05-17

刚在别的论坛有位朋友建议用substrc。

确实有机会可以解决问题。
我试试先,容后报告。

谢谢

作者: hkhome   发布时间: 2014-05-17

引用:原帖由 hkhome 於 2014-4-24 06:34 PM 发表
刚在别的论坛有位朋友建议用substrc。

确实有机会可以解决问题。
我试试先,容后报告。

谢谢
无得搞。
楼上已分析,要由第一个字起parse, 高阶语言太慢。

作者: Pseudo   发布时间: 2014-05-17

已试过,substrc系可以有限度咁做到。

aa = '国12345国'
? substr(aa,1,2) = 国
? substrc(aa,1,2) = 国1

作者: hkhome   发布时间: 2014-05-17

试下以下是分别中文字的 Pascal 码
可以睇到分辨方法, 应该检查 string 里 char 129 .. 254 ASCII
复制内容到剪贴板代码:function IsLeadByteTw(c:Char):Boolean;

begin
(* 字元对应表 ($81 .. $FE) *)
Result:=(c in [Char($81)..Char($FE)]);
{
Result:=IsDBCSLeadByte(Byte(c));
}
end;

作者: me888   发布时间: 2014-05-17

引用:原帖由 hkhome 於 2014-4-30 04:21 PM 发表
已试过,substrc系可以有限度咁做到。

aa = '国12345国'
? substr(aa,1,2) = 国
? substrc(aa,1,2) = 国1
是的,
substrc (或任何 xxxc()之类中文字串function) 功能上是'醒目'地数对中文字粒、数对中英acsii文组合字粗.
我相信佢内部已由byte one开始慢慢数.

确是「有限度」解决问题.
因为数对字粒, 代表与filesize(based on no. of ascii)之类数法有差异, 切开field width, display size, file size 时未必如愿.

作者: 111x111=12321   发布时间: 2014-05-17