PHP到Excel – 德语Umlaute

我怎样才能改变这个class级来支持德国人的幽默(Umlaute,äöüÄÖÜ)? 我试图使用utf8_encode($数组)没有成功。 还尝试将Content-Transfer-Encoding:binary更改为utf8

谢谢你指出我正确的方向。

更新:或者这个代码是什么会破坏Umlaute的原因?

class NYOS_ExcelWriter_Simple { public function CreatFile($array) { $file = $this->xlsBOF(); //íà÷èíàåì ñîáèðàòü ôàéë $tr1 = 0; foreach($array as $k => $v ) { $nn1 = 0; foreach($v as $k1 => $v1 ) { $file .= $this->xlsWriteLabel( $tr1, $nn1, $v1 ); $nn1++; } $tr1++; } $file .= $this->xlsEOF(); //çàêàí÷èâàåì ñîáèðàòü return $file; } public function LoadFile($array,$filename) { header('Content-Type: application/force-download'); header('Content-Type: application/octet-stream'); header('Content-Type: application/download'); header('Content-Disposition: attachment;filename='.$filename); header('Content-Transfer-Encoding: binary '); echo $this->CreatFile($array); } private function xlsBOF() { return pack("ssssss", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0); } function xlsEOF() { return pack("ss", 0x0A, 0x00); } private function xlsWriteNumber($Row, $Col, $Value) { return pack("sssss", 0x203, 14, $Row, $Col, 0x0). pack("d", $Value); } function xlsWriteLabel($Row, $Col, $Value ) { $L = strlen($Value); return pack("ssssss", 0x204, 8 + $L, $Row, $Col, 0x0, $L). $Value; } } $NY_excel_simple = new NYOS_ExcelWriter_Simple(); 

好的,这是非常基本的。 也许太简单了。

首先:如果您只提供带有BIFF文件的工作表,则应使用BIFF4。 所以你会避免在Excel中打开警告。

这些元音变音的问题是因为旧的Excel BIFF格式使用Windows编码而不是Unicode。 所以以下应该工作:

  class NYOS_ExcelWriter_Simple { public function CreatFile($array) { $file = $this->xlsBOF(); $tr1 = 0; foreach($array as $k => $v ) { $nn1 = 0; foreach($v as $k1 => $v1 ) { $file .= $this->xlsWriteLabel( $tr1, $nn1, mb_convert_encoding($v1, "Windows-1252", "auto") ); $nn1++; } $tr1++; } $file .= $this->xlsEOF(); return $file; } public function LoadFile($array,$filename) { header('Content-Type: application/download'); header('Content-Disposition: attachment;filename='.$filename); header('Content-Transfer-Encoding: binary '); echo $this->CreatFile($array); } private function xlsBOF() { return pack("ssssss", 0x409, 0x8, 0x0, 0x10, 0x0, 0x0); //using BIFF4 } function xlsEOF() { return pack("ss", 0x0A, 0x00); } private function xlsWriteNumber($Row, $Col, $Value) { return pack("sssss", 0x203, 14, $Row, $Col, 0x0). pack("d", $Value); } function xlsWriteLabel($Row, $Col, $Value) { $L = mb_strlen($Value); return pack("ssssss", 0x204, 8 + $L, $Row, $Col, 0x0, $L). $Value; } } $NY_excel_simple = new NYOS_ExcelWriter_Simple(); $array = array( array("foo", "bar", "hello", "world"), array("für", "bär", "hellö", "wörld"), ); $NY_excel_simple->LoadFile($array, "test.xls"); 

但是在Windows-1252中没有字形的字符是不可能的。

BIFF8支持Unicode。 但是这不能以这种方式使用。

 foreach($v as $k1 => $v1 ) { $file .= $this->xlsWriteLabel( $tr1, $nn1, mb_convert_encoding($v1, 'UTF-16LE', 'UTF-8') ); $nn1++; } 

你也可以这样转换它。