PHP导出到二进制Excel文件-UTF-8字符编码

PHP导出到二进制Excel文件-UTF-8字符编码,php,excel,character-encoding,Php,Excel,Character Encoding,我使用这个简单的函数()将PHP数组导出到简单的二进制Excel文件中。编写二进制Excel文件是我的要求 public static function array_to_excel($input) { $ret = pack('ssssss', 0x809, 0x8, 0x0, 0x10, 0x0, 0x0); foreach (array_values($input) as $lineNumber => $row) { foreach (ar

我使用这个简单的函数()将PHP数组导出到简单的二进制Excel文件中。编写二进制Excel文件是我的要求

public static function array_to_excel($input) 
{
    $ret = pack('ssssss', 0x809, 0x8, 0x0, 0x10, 0x0, 0x0);
    foreach (array_values($input) as $lineNumber => $row) 
    {
        foreach (array_values($row) as $colNumber => $data) 
        {
            if (is_numeric($data)) 
            {
                $ret .= pack('sssssd', 0x203, 14, $lineNumber, $colNumber, 0x0, $data);
            } 
            else 
            {
                $len = strlen($data);
                $ret .= pack('ssssss', 0x204, 8 + $len, $lineNumber, $colNumber, 0x0, $len) . $data;
            }
        }
    }
    $ret .= pack('ss', 0x0A, 0x00); 
    return $ret;
}
那么,将其称为非常简单:

Model_Utilities::array_to_excel($my_2d_array);
函数本身工作得很好,创建简单的二进制PHP文件非常简单。我遇到的问题是UTF-8字符。我有一些奇怪的字符,比如
Ä“
而不是正确的字符…”。。。有没有办法在my to excel函数中设置字符编码?

编辑:

在查找之前,我费力地浏览了数百份模糊的Microsoft文档,终于做了一些事情

但是,它依赖于BIFF8格式,因为据我所知,BIFF5(Excel95使用的格式)没有直接的UTF-16支持

function array_to_excel($input) 
{
    $cells = '';
    foreach (array_values($input) as $lineNumber => $row) 
    {
        foreach (array_values($row) as $colNumber => $data) 
        {
            if (is_numeric($data)) 
            {
                $cells .= pack('sssssd', 0x203, 14, $lineNumber, $colNumber, 0x0, $data);
            } 
            else 
            {
                $data = mb_convert_encoding ($data, "UTF-16LE", "UTF-8");
                $len = mb_strlen($data, "UTF-16LE");
                $cells .= pack('ssssssC', 0x204, 9+2*$len, $lineNumber, $colNumber, 0x0, $len, 0x1).$data;
           }
        }
    }
    return pack('s4', 0x809, 0x0004, 0x0600, // <- this selects BIFF8 format
                      0x10) . $cells . pack('ss', 0x0A, 0x00); 
}

$table = Array (
    Array ("Добрый день", "Bonne journée"),
    Array ("tschüß", "こんにちは。"),
    Array (30, 40));
    
$xls = array_to_excel($table);
file_put_contents ("sample.xls", $xls);
函数数组到excel($input)
{
$cells='';
foreach(数组_值($input)为$lineNumber=>$row)
{
foreach(数组_值($row)为$colNumber=>$data)
{
如果(是数字($data))
{
$cells.=pack('sssss d',0x203,14,$lineNumber,$colNumber,0x0,$data);
} 
其他的
{
$data=mb_convert_编码($data,“UTF-16LE”,“UTF-8”);
$len=mbstrlen($data,“UTF-16LE”);
$cells.=pack('ssssss c',0x204,9+2*$len,$lineNumber,$colNumber,0x0,$len,0x1)。$data;
}
}
}
返回包('s4',0x809,0x0004,0x0600,//编辑:

在查找之前,我费力地浏览了数百份模糊的Microsoft文档,终于做了一些事情

但是,它依赖于BIFF8格式,因为据我所知,BIFF5(Excel95使用的格式)没有直接的UTF-16支持

function array_to_excel($input) 
{
    $cells = '';
    foreach (array_values($input) as $lineNumber => $row) 
    {
        foreach (array_values($row) as $colNumber => $data) 
        {
            if (is_numeric($data)) 
            {
                $cells .= pack('sssssd', 0x203, 14, $lineNumber, $colNumber, 0x0, $data);
            } 
            else 
            {
                $data = mb_convert_encoding ($data, "UTF-16LE", "UTF-8");
                $len = mb_strlen($data, "UTF-16LE");
                $cells .= pack('ssssssC', 0x204, 9+2*$len, $lineNumber, $colNumber, 0x0, $len, 0x1).$data;
           }
        }
    }
    return pack('s4', 0x809, 0x0004, 0x0600, // <- this selects BIFF8 format
                      0x10) . $cells . pack('ss', 0x0A, 0x00); 
}

$table = Array (
    Array ("Добрый день", "Bonne journée"),
    Array ("tschüß", "こんにちは。"),
    Array (30, 40));
    
$xls = array_to_excel($table);
file_put_contents ("sample.xls", $xls);
函数数组到excel($input)
{
$cells='';
foreach(数组_值($input)为$lineNumber=>$row)
{
foreach(数组_值($row)为$colNumber=>$data)
{
如果(是数字($data))
{
$cells.=pack('sssss d',0x203,14,$lineNumber,$colNumber,0x0,$data);
} 
其他的
{
$data=mb_convert_编码($data,“UTF-16LE”,“UTF-8”);
$len=mbstrlen($data,“UTF-16LE”);
$cells.=pack('ssssss c',0x204,9+2*$len,$lineNumber,$colNumber,0x0,$len,0x1)。$data;
}
}
}
返回包('s4',0x809,0x0004,0x0600,//编辑:

在查找之前,我费力地浏览了数百份模糊的Microsoft文档,终于做了一些事情

但是,它依赖于BIFF8格式,因为据我所知,BIFF5(Excel95使用的格式)没有直接的UTF-16支持

function array_to_excel($input) 
{
    $cells = '';
    foreach (array_values($input) as $lineNumber => $row) 
    {
        foreach (array_values($row) as $colNumber => $data) 
        {
            if (is_numeric($data)) 
            {
                $cells .= pack('sssssd', 0x203, 14, $lineNumber, $colNumber, 0x0, $data);
            } 
            else 
            {
                $data = mb_convert_encoding ($data, "UTF-16LE", "UTF-8");
                $len = mb_strlen($data, "UTF-16LE");
                $cells .= pack('ssssssC', 0x204, 9+2*$len, $lineNumber, $colNumber, 0x0, $len, 0x1).$data;
           }
        }
    }
    return pack('s4', 0x809, 0x0004, 0x0600, // <- this selects BIFF8 format
                      0x10) . $cells . pack('ss', 0x0A, 0x00); 
}

$table = Array (
    Array ("Добрый день", "Bonne journée"),
    Array ("tschüß", "こんにちは。"),
    Array (30, 40));
    
$xls = array_to_excel($table);
file_put_contents ("sample.xls", $xls);
函数数组到excel($input)
{
$cells='';
foreach(数组_值($input)为$lineNumber=>$row)
{
foreach(数组_值($row)为$colNumber=>$data)
{
如果(是数字($data))
{
$cells.=pack('sssss d',0x203,14,$lineNumber,$colNumber,0x0,$data);
} 
其他的
{
$data=mb_convert_编码($data,“UTF-16LE”,“UTF-8”);
$len=mbstrlen($data,“UTF-16LE”);
$cells.=pack('ssssss c',0x204,9+2*$len,$lineNumber,$colNumber,0x0,$len,0x1)。$data;
}
}
}
返回包('s4',0x809,0x0004,0x0600,//编辑:

在查找之前,我费力地浏览了数百份模糊的Microsoft文档,终于做了一些事情

但是,它依赖于BIFF8格式,因为据我所知,BIFF5(Excel95使用的格式)没有直接的UTF-16支持

function array_to_excel($input) 
{
    $cells = '';
    foreach (array_values($input) as $lineNumber => $row) 
    {
        foreach (array_values($row) as $colNumber => $data) 
        {
            if (is_numeric($data)) 
            {
                $cells .= pack('sssssd', 0x203, 14, $lineNumber, $colNumber, 0x0, $data);
            } 
            else 
            {
                $data = mb_convert_encoding ($data, "UTF-16LE", "UTF-8");
                $len = mb_strlen($data, "UTF-16LE");
                $cells .= pack('ssssssC', 0x204, 9+2*$len, $lineNumber, $colNumber, 0x0, $len, 0x1).$data;
           }
        }
    }
    return pack('s4', 0x809, 0x0004, 0x0600, // <- this selects BIFF8 format
                      0x10) . $cells . pack('ss', 0x0A, 0x00); 
}

$table = Array (
    Array ("Добрый день", "Bonne journée"),
    Array ("tschüß", "こんにちは。"),
    Array (30, 40));
    
$xls = array_to_excel($table);
file_put_contents ("sample.xls", $xls);
函数数组到excel($input)
{
$cells='';
foreach(数组_值($input)为$lineNumber=>$row)
{
foreach(数组_值($row)为$colNumber=>$data)
{
如果(是数字($data))
{
$cells.=pack('sssss d',0x203,14,$lineNumber,$colNumber,0x0,$data);
} 
其他的
{
$data=mb_convert_编码($data,“UTF-16LE”,“UTF-8”);
$len=mbstrlen($data,“UTF-16LE”);
$cells.=pack('ssssss c',0x204,9+2*$len,$lineNumber,$colNumber,0x0,$len,0x1)。$data;
}
}
}


回程包('s4',0x809,0x0004,0x0600,//这是因为这段简单的代码没有定义任何字符集,我不打算写一篇关于如何修改这段代码以包含这些字符集的教程,因为这将花费太多时间long@MarkBaker是的,我自己已经弄明白了。我在四处寻找如何定义它,但没有找到任何参考。你能给我指一下s吗omwehere?我花了10年的大部分时间为PHP开发自己的Excel reader/writer库……这是我的指针(或on)干得好,马克,我知道你的库,很好,但比我需要的多10000倍。也许是一个简单的问题。我在你的文档中没有找到。它能生成二进制Excel 5.0文件吗?不幸的是,这是我的要求。上面的函数非常适合这个目的,只需要修复编码。它生成BIFF8文件作为标准的.xls输出,我们dro大约一年前,BIFF5获得了支持(理由是它已经有近20年的历史了)…但是从97开始,BIFF8 xls文件在所有版本的MS Excel中都应该是可读的,这是因为这段简单的代码没有定义任何字符集,我不打算写一篇关于如何修改这段代码以包含这些字符集的教程,因为这将花费太多时间long@MarkBaker是的,我自己也弄明白了。我一直在看how来定义它,但找不到参考。你能在这里指给我看吗?我花了10年的大部分时间来开发我自己的Excel reader/writer PHP库……这是我的指针(或on)干得好,马克,我知道你的库,它很好,但比我需要的多10000倍。也许是一个简单的问题。我在你的文档中没有找到。它能生成二进制Excel 5.0文件吗?很不幸