首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Delphi2006中删除WideString中的空字符

在Delphi2006中删除WideString中的空字符
EN

Stack Overflow用户
提问于 2010-09-10 20:42:27
回答 2查看 4.5K关注 0票数 4

我有一个包含一些数据的WideString变量,但是当字符串被赋予一些额外的空值时,这些空值或多或少地添加到数据中的随机位置。现在我需要将这些空值从变量中剥离出来。如果它是一个字符串,我会检查每个字符,看看是否Char(x) =0,但由于这是一个WideString,我认为这不可行?我怎样才能最好地去掉这些东西呢?

我使用的是Delphi 2006

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-09-10 21:44:10

您看到的可能不是空字符。它们可能只是一个码位值小于256的字符的高8位。

如果你的字符串中确实有不应该出现的空字符,你应该做的第一件事是弄清楚它们是如何到达那里的。如果它们在不应该存在的地方,那么你的程序中可能存在错误。

如果生成字符串的代码没有bug,并且仍然有不需要的空字符,那么可以相当容易地删除它们。从字符串中删除内容的常用方法是使用Delete标准函数。您可以使用#语法通过字符的数值指定任何字符,编译器通常可以确定它需要表示AnsiChar还是WideChar。

代码语言:javascript
复制
procedure RemoveNullCharacters(var s: WideString);
var
  i: Integer;
begin
  i := 1;
  while i < Length(s) do
    if s[i] = #0 then
      Delete(s, i, 1)
    else
      Inc(i);
end;

但这可能会多次重新分配字符串(每个空字符一次)。为了避免这种情况,您可以就地打包字符串:

代码语言:javascript
复制
procedure RemoveNullCharacters(var s: WideString);
var
  i, j: Integer;
begin
  j := 0;
  for i := 1 to Length(s) do
    if s[i] <> #0 then begin
      Inc(j);
      s[j] := s[i];
    end;
  if j < Length(s) then
    SetLength(s, j);
end;

这些函数适用于Delphi的任何字符串类型;只需更改参数类型即可。

票数 8
EN

Stack Overflow用户

发布于 2010-09-10 20:49:21

这些不是额外的空值。他们是这根弦的一部分。

您应该对多字节字符进行一些读取,包括WideStrings。字符的大小超过一个字节,其中一些额外的字节是NULL。

您可以从Nick Hodges的articles on Unicode开始,它是在Delphi2009首次发布时编写的,目的是帮助人们从单字节字符过渡到多字节字符。本系列有三篇文章,IIRC。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3684677

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档