$key = mb_convert_encoding($key, 'UTF-16BE', "auto");
(Tem certeza de que deseja BE? É uma codificação muito raramente usada. Windows “Unicode” é UTF-16LE.)
Eu evitaria usar
"auto"
como from_encoding. É um bodge não confiável que muitas vezes produzirá resultados errados, especialmente em cordas curtas. Como a entrada é aparentemente UTF-8, você deve declarar isso explicitamente. fputcsv($f, array_merge($firstLineKeys, $lineEncoded));
Infelizmente
fputcsv
não pode gravar em um arquivo codificado em UTF-16. Ele usa vírgulas/aspas/novas linhas ASCII de byte único, portanto, funciona apenas para codificações que são superconjuntos ASCII. Então, se você quisesse usá-lo, teria que escrever o arquivo inteiro como UTF-8 e, em seguida, transcodificar o arquivo inteiro para UTF-16. Você pode querer considerar um gravador de CSV diferente (ou seu próprio); além de ser chato de usar para codificações não-ASCII,
fputcsv
também não está em conformidade com o padrão RFC para arquivos CSV, então você pode facilmente gerar arquivos que a maioria dos softwares que consomem CSV não podem carregar corretamente. As funções CSV embutidas do PHP são essencialmente uma completa perda de tempo de todos.