大家好!问一个字符串处理的问题,拜托各位。

xiedewei 2010-05-20 12:06:04
程序按一个record从流文件读数据,其中读出一个类似这样的字符串:'CcSsDdNn.net'#$D3
意思是最后一个字节不是可视字符。现在我要把它写入数据库,两边加引号后变成:'CcSsDdNn.net?
意思是#$D3与末尾的引号组合成了一个未知字符,显示问号,这样sql就报错了。
请问,怎样把这个字符串清理一下再写入数据库?就是要清除#$D3这样的不可视字节。delphi有没有现成的方法调用?
...全文
135 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
haitao 2010-05-20
  • 打赏
  • 举报
回复
自己写一个函数判断过滤:
function restr(var s:string):boolean;
var
i:integer;
begin
result:=false;
for i:=length(s) downto 1 do
if (ord(s[i])>=$80) and (ord(s[i]<=$ff) then
begin
delete(s,i,1);
result:=true;
end;
end;
wujinyuan 2010-05-20
  • 打赏
  • 举报
回复
Str1 := '12213'#$D3;
Str1 := StringReplace(Str1,#$D3,'',[]);
wujinyuan 2010-05-20
  • 打赏
  • 举报
回复
StringReplace()可以。。
xiedewei 2010-05-20
  • 打赏
  • 举报
回复
找到一个临时解决方法:Trim(WideString('CcSsDdNn.net'#$D3))
多谢大家
wliaoc 2010-05-20
  • 打赏
  • 举报
回复
'CcSsDdNn.net'#$D3是否是因为第二个“'”符号识别错误导致sql识别不出来呢?
不担心 2010-05-20
  • 打赏
  • 举报
回复
在给record赋值之前先清空一下,全部填充0就不会有问题
fillchar(youRecord,sizeof(youRedord),0);
guanking 2010-05-20
  • 打赏
  • 举报
回复
只是建议用trim清楚不看见字符而已。
如果record里面的变量有固定长度,可以用固定长度分割字符流。
xiedewei 2010-05-20
  • 打赏
  • 举报
回复
guanking兄,Trim是不行的。
xiedewei 2010-05-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jpexe 的回复:]
可以用BASE64编码一下
[/Quote]
这样从数据库读取的时候需要解码,我改不了读数据库的代码。
xiedewei 2010-05-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sz_haitao 的回复:]
Delphi(Pascal) code
自己写一个函数判断过滤:
function restr(var s:string):boolean;
var
i:integer;
begin
result:=false;
for i:=length(s) downto 1 do
if (ord(s[i])>=$80) and (ord(s[i]<=$ff) then
……
[/Quote]
字串里有汉字,这样判断不行。
lhy 2010-05-20
  • 打赏
  • 举报
回复
定义转义字符。
guanking 2010-05-20
  • 打赏
  • 举报
回复
试试Trim、TrimLeft、TrimRight。

首部 function Trim(const S: string): string; overload; $[SysUtils.pas
首部 function Trim(const S: WideString): WideString; overload;
$[SysUtils.pas
功能 返回除去字符串S左右不可见字符
说明 小于#32的字符看作不可见字符
参考 function System.Copy
例子 Edit2.Text := Trim(Edit1.Text);

━━━━━━━━━━━━━━━━━━━━━
首部 function TrimLeft(const S: string): string; overload; $[SysUtils.pas
首部 function TrimLeft(const S: WideString): WideString; overload;
$[SysUtils.pas
功能 返回除去字符串S左边不可见字符
说明 小于#32的字符看作不可见字符
参考 function System.Copy
例子 Edit2.Text := TrimLeft(Edit1.Text);


━━━━━━━━━━━━━━━━━━━━━
首部 function TrimRight(const S: string): string; overload; $[SysUtils.pas
首部 function TrimRight(const S: WideString): WideString; overload;
$[SysUtils.pas
功能 返回除去字符串S右边不可见字符
说明 小于#32的字符看作不可见字符
参考 function System.Copy
例子 Edit2.Text := TrimRight(Edit1.Text);
JPEXE 2010-05-20
  • 打赏
  • 举报
回复
uses EncdDecd;
JPEXE 2010-05-20
  • 打赏
  • 举报
回复
可以用BASE64编码一下

16,749

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧