为什么PHP将回车/换行符组合视为一个字节?

为什么PHP将回车/换行符组合视为一个字节?,php,Php,我有一个php脚本,它将字符串截断为41字节。我打电话给strlen查看字符串的大小。但是,如果字符串具有“\r\n”组合,则此组合将被视为一个字节。所以在我的例子中,PHP认为它是41字节,而不是42字节 if (strlen($value) > 41) { $value = substr($value, 0, 41); substr还将其截断为42字节,而不是41字节 if (strlen($value) > 41) { $value = subst

我有一个php脚本,它将字符串截断为41字节。我打电话给strlen查看字符串的大小。但是,如果字符串具有“\r\n”组合,则此组合将被视为一个字节。所以在我的例子中,PHP认为它是41字节,而不是42字节

  if (strlen($value) > 41)
  {
   $value = substr($value, 0, 41);
substr还将其截断为42字节,而不是41字节

  if (strlen($value) > 41)
  {
   $value = substr($value, 0, 41);
另一种奇怪的情况。我通过这个函数传递了大量数据。成千上万的弦。如果使用更简单的测试数据集,则代码将正确工作,将“\r\n”视为2个字节

有什么想法吗?
谢谢。

将组合\r\n转换为\n,执行任何需要的操作,然后将所有\n还原为组合

str_replace("\r\n","\n",$value);
if (strlen($value) > 41)
  {
   $value = substr($value, 0, 41);
str_replace("\n","\r\n",$value);

希望这对您有用,因为您不知道您想做什么

这是一个回车换行组合,而不是相反。您能提供准备值的实际代码吗?i、 e.您的测试用例?无法在此5.3.4中重现,40个字符字符串的strlen+
\r\n
按预期返回42。你的PHP版本是什么?NetCoder-版本是5.2.9。但正如我所说的,我并不总是看到这种行为,只看到数千个字符串长的特定数据集。更简单的数据集显示预期的行为。所以我不相信5.3.4会起作用。公开你的平台和用法。如果从Windows上的文件中读取数据,它会将
\r\n
转换为
\n
,除非使用
fopen
上的
b
标志。因此,如果42字节的假设源于文件大小或
fread
长度,那么它在strlen上不会匹配。嗨,Ronan,我考虑过这个选项,但我真的想知道发生了什么。我猜可能还有另一个字符组合出现了我还不知道的相同问题。它只是
strlen
看到组合显示的样子(一个字符),因为它是用来查看它在显示器上会占用多少空间的,所以他们将其编码为将组合视为一个字符,substr使用内存块来标识字符,甚至不尝试标识它是什么。substr通常将此组合视为2个字符。在我所有的简单测试用例中,它都被视为2个字符。只有我的大数据集才被视为1个字符。您确定大数据集确实有\r\n个字符吗?而不是\n。如果是,这可能是函数忽略了\r,如果大型数据集确实有,请搜索\r\n是的。实际上,这似乎就是问题所在。多亏了这里的评论,我在测试中发现了一个缺陷,而且数据库实际上没有像我想象的那样返回回车。所以问题不在于php字符串函数,而在于我必须找到的其他地方。