修剪UTF8缓冲区

时间:2011-05-24 02:26:09

标签: c++ c

我有一个包含UTF8数据的缓冲区。我需要删除前导和尾随空格。 这是用于ASCII缓冲区的C代码(就地):

char *trim(char *s)
{
  while( isspace(*s) )
    memmove( s, s+1, strlen(s) );
  while( *s && isspace(s[strlen(s)-1]) )
    s[strlen(s)-1] = 0;
  return s;
}

如何在C / C ++中对UTF8缓冲区执行相同的操作?
附: 感谢关于strlen()的性能提示。回到UTF8具体:如果我需要一起删除所有空格,不仅仅是在开头和尾部怎么办?此外,我可能需要删除ASCII码<32的所有字符。这是针对UTF8的具体情况,比如使用mbstowcs()吗?

2 个答案:

答案 0 :(得分:4)

您是要删除所有各种Unicode空间,还是只删除ASCII空格?在后一种情况下,您根本不需要修改代码。

在任何情况下,您使用的反复调用strlen的方法效率极低。它将一个简单的O(n)操作转换为至少O(n^2)

编辑:以下是您更新问题的一些代码,假设您只想剥离ASCII空格并控制字符:

unsigned char *in, *out;
for (out = in; *in; in++) if (*in > 32) *out++ = *in;
*out = 0;

答案 1 :(得分:3)

strlen()扫描到字符串的末尾,因此在代码中多次调用它是非常低效的。

尝试寻找第一个非空格和最后一个非空格,然后记下子字符串:

char *trim(char *s)
{
  char *first;
  char *last;

  first = s;
  while(isspace(*first))
    ++first;

  last = first + strlen(first) - 1;
  while(last > first && isspace(*last))
    --last;

  memmove(s, first, last - first + 1);
  s[last - first + 1] = '\0';

  return s;
}

还记得代码修改了它的参数。

相关问题