Php 将数据保存到CSV并编码到utf-8

Php 将数据保存到CSV并编码到utf-8,php,encoding,utf-8,php-7,Php,Encoding,Utf 8,Php 7,我的数据库编码为utf8mb4。我连接此数据库并设置utf8字符集: $dbHandler = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8mb4", $dbUsername, $dbPassword); 所有数据都是用数据库进行属性编码的。我想获取数据并将其保存为CSV: $fp = fopen('data.csv', 'w+'); foreach ($result as $row) { ... fputcsv($fp

我的数据库编码为
utf8mb4
。我连接此数据库并设置utf8字符集:

$dbHandler = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8mb4", $dbUsername, $dbPassword);
所有数据都是用数据库进行属性编码的。我想获取数据并将其保存为CSV:

$fp = fopen('data.csv', 'w+');
foreach ($result as $row) {
...
    fputcsv($fp, $csvData, ';');
}
但是所有的编码都被破坏了:
groÃe
ZubehÃ`r.

我尝试添加BOM(没有帮助)并转换
array\u映射(“utf8\u encode”,$csvData)(有些字符显示正确:
große
Zubehör
,但有些字符显示不正确:
kabeverl?ng
F?r
)。有什么想法吗

编辑: hextump输出文件的开头:

00000000: efbb bf70 726f 6475 6374 3b61 7274 6963  ...product;artic
00000010: 6c65 3b73 6b75 3b64 6174 653b 6e61 6d65  le;sku;date;name
00000020: 0a30 3030 3239 3039 3530 3030 3b3b 3b3b  .00028151000;;;;
00000030: 2242 7265 616b 6f75 742d 626f 7820 4b70  "Breakout-box Kp
00000040: 6c2e 223b 223c 7374 726f 6e67 3e42 7265  l.";"<strong>Bre
00000050: 616b 6f75 742d 626f 7820 4b70 6c2e 3c2f  akout-box Kpl.</ 

问题是我使用的是
strtolower
ucfirst
。我把它改成了

$name = mb_convert_case($name, MB_CASE_LOWER, "UTF-8");
$name = mb_convert_case($name, MB_CASE_TITLE, "UTF-8");

它可以工作。

CSV文件的编码是否已损坏,或者您的CSV编辑器是否没有正确解释它?你能问一下添加CSV的hexdump(不是全部,而是
xxd file.CSV
输出的前六行左右)的问题吗?我想是…我在vim和Excel中检查过。两者都有相同的问题。“非ISO扩展ASCII文本”是可疑的。
文件
应该识别UTF-8。而且您肯定是从那里的UTF-8 BOM开始的。您是否可以扩展hexdump,以解决一些有问题的字符?(根据我自己的经验,Excel最好使用带BOM的制表符分隔的UTF-16,而不是带BOM或不带BOM的逗号分隔的UTF-8。)我已经生成了csv,并且只在那里放了一行。我将hexdump附加到了原始帖子。我刚刚删除了UCWord和strtolower,它成功了!
file
为我提供了
data.csv:UTF-8 Unicode文本,具有很长的行,编码是正确的。
data.csv: Non-ISO extended-ASCII text, with very long lines
$name = mb_convert_case($name, MB_CASE_LOWER, "UTF-8");
$name = mb_convert_case($name, MB_CASE_TITLE, "UTF-8");