PHP在读取文本文件时是否正在删除CR?

PHP在读取文本文件时是否正在删除CR?,php,text,text-processing,carriage-return,file-read,Php,Text,Text Processing,Carriage Return,File Read,某个txt文件只包含CRLF换行符。已通过在记事本++中打开启用“显示所有字符”的文件进行确认 使用PHP读取文件时,使用file_get_contents()或fopen()时,CR字符似乎被过滤掉: <?php ... $fh = fopen($path, 'r'); while (!feof($fh)) { $string .= fread($fh, 1024); } preg_match_all('/\r/', $stri

某个txt文件只包含CRLF换行符。已通过在记事本++中打开启用“显示所有字符”的文件进行确认

使用PHP读取文件时,使用file_get_contents()或fopen()时,CR字符似乎被过滤掉:

<?php
    ...
    $fh = fopen($path, 'r');

    while (!feof($fh)) {
        $string .= fread($fh, 1024);
    }

    preg_match_all('/\r/', $string, $matches);
    var_dump($matches);

    // 0 matches: array(1) { [0]=> array(0) { } }

    $string2 = file_get_contents($path);
    preg_match_all('/\r/', $string2, $matches2);
    var_dump($matches2);

    // 0 matches: array(1) { [0]=> array(0) { } }
?>

我很困惑,因为每个函数的文档都没有提到这一点。也许还有其他方法可以精确地打开存储的文件

需要确认这些函数是否过滤或“规范化”CR字符。那么,这些函数还可能“规范化”什么呢?有没有办法避免这种行为

更明确地说,当我将文件加载到变量中时,我需要这些CR字符和每一位保持不变

谢谢

尝试以下解决方案:

preg_match_all('/'.PHP_EOL.'/', $string, $matches);
PHP_EOL以跨平台的方式作为换行符,因此它可以处理Windows/Mac/Unix

还要检查该常数。

是的,这是fopen根据您提供的参数所做的,您可以在文档中找到它:

Windows提供了一个文本模式转换标志('t'),它将 使用文件时,将\n透明地转换为\r\n。在里面 相比之下,您还可以使用“b”强制二进制模式,这将不起作用 翻译你的数据。要使用这些标志,请将“b”或“t”指定为 模式参数的最后一个字符

i、 e.您可以通过在模式参数中使用“b”标志来避免这种“转换”。例如:

fopen($path, 'rb'); // Read in binary mode

尝试
“\\r”
而不是
”\r'
。尝试“/\\r/”,但仍然相同。EOL在windows和unix中不同。如果您按代码读取windows文本文件,\r将被找到。如果是一个-不是。它只写NLcharacter@splash58我知道,但是如果文件在其确切的二进制内容上有签名呢?PHP中应该有一种方法来加载CR字符,这些字符与任何给定文件中的每个字节和位相同。是否有任何参数或函数可以实现这一点?文件中没有使用换行符的信息。最好说一下你想要它的目的是什么。那么PHP是“规范化”还是在加载文件时对内容进行处理呢?有可能避免这种行为吗?我认为您应该能够使用
open($file,'rb')
以二进制模式打开文件。那么PHP将不会替换换行符。@Aufziehvogel您是正确的,但只是有一点细节,
open
拼写错误,它是
fopen
。我没有注意到它,因为我不知道
open
函数不存在。