修剪UTF8缓冲区

问题描述

| 我有一个带有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()?     

解决方法

您是否还要删除所有各种Unicode空格,或仅删除ASCII空格?在后一种情况下,您根本不需要修改代码。 无论如何,您使用的方法反复调用
strlen
效率极低。它将简单的“ 2”运算变成至少“ 3”。 编辑:这是您更新的问题的一些代码,假设您只想剥离ASCII空格和控制字符:
unsigned char *in,*out;
for (out = in; *in; in++) if (*in > 32) *out++ = *in;
*out = 0;
    ,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;
}
还请记住,代码会修改其参数。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...