php - 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 也会给出奇怪的输出。
解决方案
您的文件可能以 UTF-16 编码(无论您从何处导出文件,都可能被错误地称为“Unicode”),这意味着每个其他字节都是NUL
基本 ASCII 字符的字节。您要么希望在 PHP 之外将文件转换为纯 ASCII/UTF-8,要么在 PHP 内部使用 或 将其转换iconv
为mb_convert_encoding
.
推荐阅读
- android - 如何在android中使用房间加载db文件
- android - WebViewClient 不会打开在 shouldOverrideUrlLoading() 中处理的页面
- stata - 打开非常大的 Excel 文件
- css - 在 css 中闪烁边框 3 次(每个循环 1 秒)
- neo4j - Neo4j 浏览器不再工作
- javascript - 我收到重复键错误 - MongoError:E11000 重复键错误集合。我确实有 2 个集合,用户和个人资料。
- git - 将分支 Y 合并到 X 后,创建了三个版本的文件:fetch(X)、merge(X) 和 X
- android - IDEA不断更新索引
- php - 修补实体时出错
- mysql - 使用多个聚合的 SQL 高级联接