0

MySQLから.XLSファイルにデータを転送しているときに、エンコードに問題が発生しました。テーブルは「utf8_czech_ci」で、PHPスクリプトはUTF-8です。私はいつも「ěščřžýáíé」のような文字を「ěšÄřžã½ããé」のような悪い形で受け取ります。私のスクリプトがあります

<?php

mb_http_input("utf-8");
mb_http_output("utf-8");

     $dbhost  = "XXXXXXXXXXX";
     $dbuser  = "XXXXXXXXXXX";
     $dbpass  = "XXXXXXXXXXX";
     $dbname  = "XXXXXXXXXXX";
     $dbtable = $_GET['table'];

function xlsBOF() {
    echo pack("ssssss", 0x809, 0x8, 0x0, 0x10, 0x0, 0x0);
    return;
}

function xlsEOF() {
    echo pack("ss", 0x0A, 0x00);
    return;
}

function xlsWriteLabel($Row, $Col, $Value ) {
    $L = strlen($Value);
    echo pack("ssssss", 0x204, 8 + $L, $Row, $Col, 0x0, $L);
    echo $Value;
    return;
}

$dbc = mysql_connect( $dbhost , $dbuser , $dbpass ) or die( mysql_error() );
mysql_query("set names utf8;");
mysql_select_db( $dbname );
$q = "SELECT * FROM ".$dbtable."";
$qr = mysql_query( $q ) or die( mysql_error() );

header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-type: application/vnd.ms-excel; charset=utf-8");
header("Content-Disposition: attachment;filename=export_".$dbtable.".xls ");
header("Content-Transfer-Encoding: binary ");
xlsBOF();

$col = 0;
$row = 0;
$first = true;

while( $qrow = mysql_fetch_assoc( $qr ) )
{
    if( $first )
    {
        foreach( $qrow as $k => $v )
        {
            xlsWriteLabel( $row, $col, strtoupper( ereg_replace( "_" , " " , $k ) ) );
            $col++;
        }
        $col = 0;
        $row++;
        $first = false;
    }
    foreach( $qrow as $k => $v )
    {
        xlsWriteLabel( $row, $col, $v );
        $col++;
    }

    $col = 0;
    $row++;
}

xlsEOF();
exit();

回答ありがとうございます...

4

1 に答える 1

0

Excel ファイルはコードページ ブロックを使用してファイル内で使用されている文字セットを識別しますが、デフォルトではロケール コードページが使用されます。UTF-8 を強制したい場合は、UTF-8 コードページ ブロックも記述する必要があります。

$record          = 0x0042;   // Record identifier
$length          = 0x0002;   // Number of bytes to follow
$cv              = 0x04B0;   // The UTF-8 code page

$header          = pack('vv', $record, $length);
$data            = pack('v',  $cv);
于 2013-02-14T07:37:34.577 に答える