$key = mb_convert_encoding($key, 'UTF-16BE', "auto");
(¿Está seguro de que desea BE? Es una codificación que se usa muy raramente. "Unicode" de Windows es UTF-16LE).
Evitaría usar "auto"
como from_encoding. Es un bodge poco confiable que a menudo producirá resultados incorrectos, especialmente en cuerdas cortas. Como la entrada aparentemente es UTF-8, debe indicarlo explícitamente en su lugar.
fputcsv($f, array_merge($firstLineKeys, $lineEncoded));
Desafortunadamente fputcsv
no puede escribir en un archivo codificado en UTF-16. Utiliza comas/comillas/nuevas líneas ASCII de un solo byte, por lo que solo funciona para codificaciones que son superconjuntos ASCII. Entonces, si quisiera usarlo, tendría que escribir todo el archivo como UTF-8 y luego transcodificar todo el archivo a UTF-16.
Es posible que desee considerar un escritor de CSV diferente (o el suyo propio); además de ser molesto de usar para codificaciones no ASCII, fputcsv
tampoco cumple con el estándar RFC para archivos CSV, por lo que puede generar fácilmente archivos que la mayoría del software que consume CSV no puede cargar correctamente.
Las funciones CSV integradas de PHP son esencialmente una completa pérdida de tiempo para todos.