我有一个包含一些数据的WideString变量,但是当字符串被分配了一些额外的空值时,在数据中或多或少的随机位置添加.我现在需要从变量中删除这些空值.如果它是一个字符串我会检查每个Char以查看Char(x)= 0但是因为这是一个WideString我不认为这个工作?我怎样才能最好地解决这些问题呢?
我正在使用Delphi 2006
我使用这段代码加载一个文本文件(我的文件编码是UTF-8)(如何在Delphi中读取包含'NULL CHARACTER'的文本文件?):
uses
IOUtils;
var
s: string;
ss: TStringStream;
begin
s := TFile.ReadAllText('c:\MyFile.txt');
s := StringReplace(s, #0, '', [rfReplaceAll]); //Removes NULL CHARS
ss := TStringStream.Create(s);
try
RichEdit1.Lines.LoadFromStream(ss, TEncoding.UTF8); //UTF8
finally
ss.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
但我的问题是,RichEdit1不加载整个文本.这不是因为空字符.这是因为编码.当我使用此代码运行应用程序时,它会加载整个文本:
uses
IOUtils;
var
s: string;
ss: TStringStream;
begin
s := TFile.ReadAllText('c:\MyFile.txt');
s := StringReplace(s, #0, '', [rfReplaceAll]); //Removes NULL CHARS
ss := TStringStream.Create(s);
try
RichEdit1.Lines.LoadFromStream(ss, TEncoding.Default);
finally
ss.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
我换TEncoding.UTF8了TEncoding.Default.加载了整个文本,但它的格式不正确,并且不可读.
我猜有些字符是UTF 8不支持的.因此,加载过程在想要加载该char时停止.
请帮忙.任何解决方法?
****编辑:**
我确定它 …
几个月前我问了一个类似的问题.感谢Rob Kennedy,我可以把我的整个文本加载到Richedit 但是我无法删除Null chars.因为我用过,我可以加载我的文本Stream.
现在在这段代码中:
var
strm : TMemorystream;
str : UTF8string;
ss : TStringstream;
begin
strm := tmemorystream.Create;
try
strm.LoadFromFile('C:\Text.txt');
setstring(str,PAnsichar(strm.Memory),strm.Size);
str := StringReplace(str, #0, '', [rfReplaceAll]); //This line doesn't work at all
ss := tstringstream.Create(str);
Richedit1.Lines.LoadFromStream(ss);
finally
strm.Free;
ss.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
我转换TMemorystream为string删除Null Chars,StringReplace()然后再将其转换TStringstream为加载它Richedit.lines.LoadFromStream.
但我的问题是我无法删除Null Character使用StringReplace().我可以替换其他角色但不能#0.
有没有办法直接删除null charcters TMemorystream并将其加载到Richedit …