fgetcsv está comendo a primeira letra de uma String se for um trema
Eu estou importando o conteúdo de um arquivo CSV gerado pelo Excel para um documento XML como:
$csv = fopen($csvfile, r);
$words = array();
while (($pair = fgetcsv($csv)) !== FALSE) {
array_push($words, array('en' => $pair[0], 'de' => $pair[1]));
}
Os dados inseridos são expressões em inglês / alemão.
Eu insiro esses valores em uma estrutura XML e imprimo o XML da seguinte forma:
$dictionary = new SimpleXMLElement('<dictionary></dictionary>');
//do things
$dom = dom_import_simplexml($dictionary) -> ownerDocument;
$dom -> formatOutput = true;
header('Content-encoding: utf-8'); //<3 UTF-8
header('Content-type: text/xml'); //Headers set to correct mime-type for XML output!!!!
echo $dom -> saveXML();
Isso está funcionando bem, mas estou encontrando um problema realmente estranho. Quando a primeira letra de uma String é um trema (como emÖsterreich
ouÄgypten
) o caracter será omitido, resultando emgypten
ousterreich
. Se o Umlaut estiver no meio da String (Russische Föderation
) é transferido corretamente. O mesmo vale para coisas comoß
oué
como queiras.
Todos os arquivos são codificados em UTF-8 e são exibidos em UTF-8.
Isso parece bastante estranho e parecido com um bug para mim, mas talvez eu esteja sentindo falta de algo, há muitas pessoas inteligentes por aqui.