【问题标题】:Why is PHP Treating Carriage Return / Linefeed Combo as a Single Byte?为什么 PHP 将回车/换行组合视为单个字节?
【发布时间】:2011-01-06 00:15:48
【问题描述】:

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

substr 也将其截断为 42 而不是 41 个字节。

  if (strlen($value) > 41)
  {
   $value = substr($value, 0, 41);

另一个奇怪的情况。我有大量数据正在通过这个函数。千弦。如果我使用更简单的测试数据集,则代码可以正常工作,将“\r\n”视为 2 个字节。

有什么想法吗? 谢谢。

【问题讨论】:

  • 这是一个回车换行组合,而不是相反。
  • 您能否提供您准备值的实际代码?即您的测试用例?
  • 无法在 5.3.4 上重现,strlen 的 40 个字符的字符串 + \r\n 按预期返回 42。你的 PHP 版本是多少?
  • NetCoder - 版本为 5.2.9。但正如我所说,我并不总是看到这种行为,只有在数千个字符串长的特定数据集上。更简单的数据集显示了预期的行为。所以我不相信 5.3.4 会起作用。
  • 披露您的平台和使用情况。如果您从 Windows 上的文件中读取数据,它将把 \r\n 转换为 \n,除非您在 fopen 上使用了 b 标志。因此,如果 42 字节的假设源于文件大小或 fread 长度,那么它不会在 strlen 上匹配。

标签: php


【解决方案1】:

将组合 \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);

希望这对你不知道你想做什么的时候有用

【讨论】:

  • 嗨,Ronan,我已经考虑过这个选项,但我真的很想知道发生了什么。我猜可能还有另一个字符组合会给出我还不知道的相同问题。
  • 这只是 strlen 在显示时看到组合(一个字符),因为它是为了查看它将在监视器上占用多少空间而构建的,因此他们对其进行编码以将组合视为一个character , substr 使用内存块来识别字符,甚至不尝试识别它是什么
  • strlen 通常将此组合视为 2 个字符。在我所有的简单测试用例中,它被视为 2 个字符。只有在我的大型数据集中,它才被视为 1 个字符。
  • 你确定大型数据集真的有 \r\n 吗?而不是 \n ? .如果是,这可能是该函数忽略了 \r ? , 搜索大数据集是否真的有 \r 和
  • 是的。实际上,这似乎是问题所在。多亏了这里的 cmets,我发现我的测试存在缺陷,并且数据库实际上没有像我想象的那样有回车。所以问题不在于 php 字符串函数,而是我必须找到的其他地方。
猜你喜欢
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 2019-11-24
  • 2011-06-27
  • 2021-02-04
  • 2012-04-19
  • 2018-05-10
  • 1970-01-01
相关资源
最近更新 更多