当字符串中存在非英文字符时,Strlen 函数给出错误的长度

Bov*_*ver 3 c encoding string-length strlen non-english

我有一个程序也接受非英语字符作为输入字段。因为我们使用strlen,所以当存在非英文字符时,在计算字符串长度时,它无法给出预期的长度。对于输入nova,输出是4,而对于输入\xc3\xb1ova,输出是5,而输出应该是4

\n
    \n
  1. strlen("nova")=4
  2. \n
  3. strlen("\xc3\xb1ova")=5
  4. \n
\n

在第二种情况下,我期望输出为4相反。

\n

Tob*_*ght 5

请记住,strlen返回的计数char,这不一定与打印时可见字形的数量相同。

\n

结果将取决于您系统的字符编码 - 使用 ISO-8859.1,与(长度 4)"\xc3\xb1ova"相同{ 241, 111, 118, 97, 0},但如果您使用 UTF-8,则为\xc3\xb1多字节字符,字符串表示为{195, 177, 111, 118, 97, 0}(length 5)。

\n

如果您想计算代码点的数量,那么您可能需要使用mbrlen()而不是strlen(). 如果您想计算“用户”字符的数量,考虑到组合重音等,那么您确实需要一个字符处理库,例如 ICU。

\n

  • 更复杂的是,“ñova”是“{195, 177, 111, 118, 97, 0}”,长度为 5,但“ñova”是“{110, 204, 131, 111, 118, 97, 0}”长度为6。那是因为`ñ`有两种写法。正如你所说,计算字形很复杂,并且在 C 标准库中找不到。 (3认同)