是否有一个与char16_t一起使用的strlen()?

Jen*_*off 7 c unicode c11

正如问题所说:

typedef __CHAR16_TYPE__ char16_t; 

int main(void)
{
  static char16_t test[] = u"Hello World!\n";

  printf("Length = %d", strlen(test)); // strlen equivalent for char16_t ???

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我搜索并发现只有C++解决方案.

我的编译器是GCC 4.7.

编辑:

为了澄清,我正在寻找一个能够返回计数的解决方案code points,而不是计数characters.

对于UTF-16包含字符外的字符串,这两个字符串完全不同BMP.

ask*_*ish 5

这是你的基本力量:

int strlen16(const char16_t* strarg)
{
   int count = 0;
   if(!strarg)
     return -1; //strarg is NULL pointer
   char16_t* str = strarg;
   while(*str)
   {
      count++;
      str++;
   }
   return count;
}
Run Code Online (Sandbox Code Playgroud)

这是一个更有效和更受欢迎的 strlen:

int strlen16(const char16_t* strarg)
{
   if(!strarg)
     return -1; //strarg is NULL pointer
   char16_t* str = strarg;
   for(;*str;++str)
     ; // empty body
   return str-strarg;
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。

警告:这在计算 UTF-16 字符串的字符(不是代码点)时无法正常工作。当__STDC_UTF_16__定义为时尤其如此1

UTF-16 是可变长度的(BMP 中每个字符 2 个字节或 BMP 之外每个字符 4 个字节)并且这些函数不涵盖。

  • 不需要或有用的空检查。 (3认同)
  • @Wiz 这取决于您对 unicode 字符串的 strlen 的期望。我接受了这个答案,因为它符合我的要求。你是对的,虽然应该知道代理人。 (2认同)

Rav*_*ven 5

std::char_traits有这个。

#include <string>

std::char_traits<char16_t>::length(yourchar16pointerhere);
Run Code Online (Sandbox Code Playgroud)