9

我不知道在 PHP 数据库中用什么关键字来查找它,所以我在这里问。

我想知道的原因是因为不同的操作系统如何处理文本文档中的新行。

我在 Windows 中使用 CSV 文件,但每次我想我添加一个新行时,真正发生的是新行被粘贴到最新行的后面。

原因是,在 Windows 中,一个新行是这样的:\r\n 而我正在使用的 CSVHandler.class.php 文件只添加\n

但是,在 MAC OS X 中,这是新行,与 windows 不同。

所以我正在寻找这个,所以我可以实现一个简单的if()语句并解决这个问题。目前我已经硬编码了\r\n,但它应该更简单,不是吗?

4

13 回答 13

35

*“顺便说一句,nix OS 使用 \n 作为换行符。Mac 使用 \r,Windows - \r\n”

啊!请停止延续这个神话!

Mac OS 9 像 10 年前一样使用它,但现在没有人使用 OS9。MACS 使用 UNIX 行结尾。\n。今天使用的“Mac”应该是指现代计算机,就像“Windows”是指 XP 或 vista 一样,除非另有限定。

说 Mac 使用 \r 与说“Windows 在 MS-DOS 之上运行,仅支持 FAT16 文件系统,并且不支持 64 位”一样正确。

在任何情况下,任何人都不应该将 \r 用于任何事情。除非他们针对的是老式 Mac。

于 2009-03-17T21:59:09.577 回答
14

PHP 已包含常量PHP_EOL用于解决您面临的问题,自 php 4.3.10 和 PHP 5.0.2 起可用 - 它包含适用于运行 PHP 的服务器的行尾序列。

如果您想使用适合特定客户端的不同行尾序列,那么您必须自己编写代码。确定客户端操作系统的一种方法是使用get_browser,假设您的服务器具有最新的browscap.ini

于 2009-03-08T16:12:01.740 回答
12

您可以使用预定义的常量PHP_OS

我正在使用

如果(PHP_OS === 'WINNT'){...}

于 2010-11-08T15:18:28.607 回答
5

服务器操作系统信息可以通过以下php_uname()函数获取:

echo 'I have been run on '.php_uname('s');

它还允许检索版本的完整信息。

于 2009-03-18T08:33:11.470 回答
2

检查 $_SERVER 变量。

echo "<pre>";
print_r($_SERVER);

然后,您可以使用 strstr(或任何字符串比较函数)检查您是否在 Windows 上。在这个例子中,我检查了 SERVER_SIGNATURE 但你可以使用任何你想要的键。

$isWindows = strstr($_SERVER[SERVER_SIGNATURE], "Win32") !== FALSE;
于 2009-03-08T16:06:50.693 回答
2

您可能还想调用 php info 来查看 PHP 设置中的许多配置设置,代码很简单:

phpinfo();
于 2009-03-08T16:23:46.813 回答
2

据我所知,如果 PHP 在 Windows 上运行,将会有一个名为 WINDIR 的环境变量。我认为你可以这样做:

$isWindows = isset($_SERVER['WINDIR']);
于 2011-11-19T03:30:55.063 回答
1

有很多答案,但这是我的 2cents:

function windows_server()
#   Purpose:    Check if server is Windows
{
    return in_array(strtolower(PHP_OS), array("win32", "windows", "winnt"));
}

## --------------------------------------------------------

function linux_server()
#   Purpose:    Check if server is Linux
{
    return in_array(strtolower(PHP_OS), array("linux", "superior operating system"));
}
于 2011-07-05T21:04:11.813 回答
1

我推荐php_uname。只需阅读文档中的解释:

php_uname — 返回有关 PHP 正在运行的操作系统的信息

我确实喜欢上面PHP_OS的建议,但要小心,根据文档中的这个注释:

考虑使用 PHP_OS 常量,但请记住,此常量将包含构建PHP 的操作系统。

于 2011-10-07T21:24:17.490 回答
0

读取时最安全的做法可能是确定文件本身的行尾字符,或者可互换地接受所有行尾。如果您将 csv 文件从一台机器复制到具有不同操作系统的另一台机器,这可以保护您免受伤害。如果您在写入之前阅读,则可以使输出的行尾与您在阅读时确定的行尾匹配。

对于 CSV 文件,php 有一些库函数。尝试在 php.net 中搜索 fgetcsv 和 fputcsv。有可以在 php.ini 中设置的 auto_detect_line_endings,但我不知道它是如何工作的细节。

我总是在 linux 和 windows 上单独使用“\n”。我使用记事本在 Windows 中编辑它们,并且不会破坏结尾。对于我自己对 csv 的使用,我发现支持不同的结局太麻烦了,但如果它是用户必须与之交互的东西,那么你想要安全而不是方便。

于 2009-03-08T16:25:28.870 回答
0
<?php
$OSList = array
(
        // Match user agent string with operating systems
        'Windows 3.11' => 'Win16',
        'Windows 95' => '(Windows 95)|(Win95)|(Windows_95)',
        'Windows 98' => '(Windows 98)|(Win98)',
        'Windows 2000' => '(Windows NT 5.0)|(Windows 2000)',
        'Windows XP' => '(Windows NT 5.1)|(Windows XP)',
        'Windows Server 2003' => '(Windows NT 5.2)',
        'Windows Vista' => '(Windows NT 6.0)',
        'Windows 7' => '(Windows NT 7.0)',
        'Windows NT 4.0' => '(Windows NT 4.0)|(WinNT4.0)|(WinNT)|(Windows NT)',
        'Windows ME' => 'Windows ME',
        'Open BSD' => 'OpenBSD',
        'Sun OS' => 'SunOS',
        'Linux' => '(Linux)|(X11)',
        'Mac OS' => '(Mac_PowerPC)|(Macintosh)',
        'QNX' => 'QNX',
        'BeOS' => 'BeOS',
        'OS/2' => 'OS/2',
        'Search Bot'=>'(nuhk)|(Googlebot)|(Yammybot)|(Openbot)|(Slurp)|(MSNBot)|(Ask Jeeves/Teoma)|(ia_archiver)'
);

// Loop through the array of user agents and matching operating systems
foreach($OSList as $CurrOS=>$Match)
{
        // Find a match
        if (eregi($Match, $_SERVER['HTTP_USER_AGENT']))
        {
                // We found the correct match
                break;
        }
}
// You are using Windows Vista
echo "You are using ".$CurrOS;
?>
于 2009-11-28T00:35:13.750 回答
0
$svr_os=strtolower(reset(explode(' ',php_uname('s'))));

$isLinux=$svr_os==='linux';

$isWindows=$svr_os==='windows';
于 2010-02-01T16:24:18.223 回答
-2

另外,试试这个功能:

$b = get_browser(null, true);

并且在 $b['platform'] 中将是 OS。

顺便说一句,*nix OS 使用 \n 作为新行。Mac 使用 \r,Windows - \r\n

于 2009-03-08T16:14:42.357 回答