首页 > 解决方案 > PHP:我从带有双引号的 CSV 文件中得到奇怪的输出,例如 \x00P\x00h\x00o\x00n

问题描述

我正在使用一个简单的函数来上传 .csv 文件并将其转换为关联数组。如果没有引号,它可以正常工作,但如果有引号,我会得到非常奇怪的输出。

我的工作文件如下所示:

Phone number:
+1 5556666999
+1 5551123336

这是我的输出:

array:2 [▼
  0 => array:1 [▼
    "Phone number" => "+1 5556666999"
  ]

  1 => array:1 [▼
    "Phone number" => "+1 5551123336"
  ]
]


print_r(csvToAssocArray($filename);

function csvToAssocArray($filename)
{
    $csvAsArray = array_map(function($d) {
            return str_getcsv($d, ",");
        }, file($filename));

        $header = array_shift($csvAsArray);

        $csv = array();

        foreach ($csvAsArray as $row) {
          $csv[] = array_combine($header, $row);
        }

    return $csv;
}

但是如果我有一个这样的文件,我的值周围有双引号,那么我会得到这个值。

我的文件:

"Phone number"
"+1 55500718"
"+1 55551919"

file_get_contents($file)

"""
"\x00P\x00h\x00o\x00n\x00e\x00 \x00n\x00u\x00m\x00b\x00e\x00r\x00"\x00\n
\x00"\x00+\x001\x00 \x005\x005\x005\x000\x000\x007\x001\x008\x00"\x00\n
\x00"\x00+\x001\x00 \x005\x005\x005\x005\x001\x009\x001\x009\x00"\x00\n
\x00
"""

print_r(csvToAssocArray($filename);

array:3 [▼
  0 => array:1 [▼
    "\x00P\x00h\x00o\x00n\x00e\x00 \x00n\x00u\x00m\x00b\x00e\x00r\x00\x00" => "\x00"\x00+\x001\x00 \x005\x005\x005\x000\x000\x007\x001\x008\x00"\x00"
  ]

  1 => array:1 [▼
    "\x00P\x00h\x00o\x00n\x00e\x00 \x00n\x00u\x00m\x00b\x00e\x00r\x00\x00" => "\x00"\x00+\x001\x00 \x005\x005\x005\x005\x001\x009\x001\x009\x00"\x00"
  ]

  2 => array:1 [▼
    "\x00P\x00h\x00o\x00n\x00e\x00 \x00n\x00u\x00m\x00b\x00e\x00r\x00\x00" => "\x00"
  ]
]

这里发生了什么?甚至 file_get_contents 也会给出奇怪的输出。

标签: phpcsv

解决方案


您的文件可能以 UTF-16 编码(无论您从何处导出文件,都可能被错误地称为“Unicode”),这意味着每个其他字节都是NUL基本 ASCII 字符的字节。您要么希望在 PHP 之外将文件转换为纯 ASCII/UTF-8,要么在 PHP 内部使用 或 将其转换iconvmb_convert_encoding.


推荐阅读