为什么有人会选择使用strlen而不是mb_strlen?

4
有一些遗留代码需要我从iso-8859-2转换为UTF-8。其中一个问题是广泛使用了strlen函数。我最初想替换所有strlen的出现为mb_strlen
然而,我的一个同事说这将是一个错误。我知道这两个函数之间的区别——如果字符串中有重音字符,则strlen将返回它实际占用的字节数,而mb_strlen将返回字符数。
现在,一位同事说,也许,只是可能会有某种情况需要返回字符串中字节的数量,但他无法给我任何这样的情况的例子。
整个代码中大约有900个strlen出现,分析每个出现需要几天时间。
问题是,在什么情况下,有人需要返回字符串中字节的数量而不是字符数?

1
看一下这个,你需要改变的唯一一件事是当你尝试使用strlen来获取字节计数时。字节计数在你想要查看一个字符串放入容器(如db字段或固定长度文件)时将占用多少空间时非常有用,如果你想要报告准确的Content-Length头信息,这也很重要。 - Orangepill
2个回答

6

我能想到几种情况:

  • 将字符串存储在文件或数据库中
  • 将字符串写入套接字以通过网络发送
  • 调用需要以字节长度为参数的遗留API或COM方法

好的,谢谢。但是你知道在代码中要查找什么来检测这种情况吗? - konrados
1
通常需要考虑strlen/mn_strlen的结果如何被使用。它是被传递给需要字符数的函数,还是被传递给需要字节数的函数?除此之外,很难提出一个普遍规则,我个人认为。 - Carsten Hansen
通常情况下,像这样的边缘案例应该由单元测试来覆盖。 - Yevgeniy Afanasyev

1
另外我们应该注意到,strlen函数更快。在我进行的一个简单测试中,针对一个包含20个字符和1000000次重复的字符串:
strlen    : 0.044954061508179
mb_strlen : 1.2507030963898

所以如果我们的字符串是ISO(而不是utf-8),我认为strlen是一个更好的选择。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接