Heim > Artikel > Backend-Entwicklung > So lösen Sie das Problem verstümmelter Zeichen, wenn PHP UTF-8-codierte CSV-Dateien generiert und diese mit Excel öffnet
Ursache: Die ausgegebene CSV-Datei enthält keine Stückliste.
Was ist Stückliste?
In der UCS-Codierung gibt es ein Zeichen namens „ZERO WIDTH NO-BREAK SPACE“, und seine Codierung ist FEFF. FFFE ist ein Zeichen, das in UCS nicht existiert und daher in der tatsächlichen Übertragung nicht vorkommen sollte. Die UCS-Spezifikation empfiehlt, dass wir vor der Übertragung des Bytestreams die Zeichen „ZERO WIDTH NO-BREAK SPACE“ übertragen. Wenn der Empfänger FEFF empfängt, zeigt er auf diese Weise an, dass der Bytestrom Big-Endian ist. Wenn er FFFE empfängt, zeigt er an, dass der Bytestrom Little-Endian ist. Daher wird das Zeichen „ZERO WIDTH NO-BREAK SPACE“ auch BOM genannt.
UTF-8 erfordert keine Stückliste zur Angabe der Bytereihenfolge, kann die Stückliste jedoch zur Angabe der Kodierungsmethode verwenden. Die UTF-8-Kodierung des Zeichens „ZERO WIDTH NO-BREAK SPACE“ ist EF BB BF. Wenn der Empfänger also einen Bytestrom empfängt, der mit EF BB BF beginnt, weiß er, dass dieser UTF-8-codiert ist.
Windows verwendet BOM, um die Kodierungsmethode von Textdateien zu markieren.
Wie gebe ich Stücklisten in PHP aus?
Bevor alle Inhalte ausgegeben werden
print(chr(0xEF).chr(0xBB).chr(0xBF));
Beispielcode:
<?php function writeCsvToFile($file,array $data){ $fp = fopen($file, 'w'); //Windows下使用BOM来标记文本文件的编码方式 fwrite($fp,chr(0xEF).chr(0xBB).chr(0xBF)); foreach ($data as $line) { fputcsv($fp, $line); } fclose($fp); }