使用fgetcsv在浏览器中启用提取和显示外语内容

时间:2016-03-02 13:30:07

标签: php csv utf-8 header fgetcsv

  

iD;英语[en];中文[zh];德语[de];印地语[hi];印地语(TOGO)[hi_TG];日语[ja]   Source [local] .AlarmGroup [AlarmText_02] .ID [1310:90]; Unwinder:Accu位置差异太大。检查层压板断裂;拆卷器:蓄存器位置差过大。检查复合片材是否中断; Laminatspeicher:ZugrossePositionsänderung - AufLaminatrissprüfen; 290 ;;巻出装置:アキュムレーター位置の差が大きすぎます。ラミネートが壊れていないか确认してください   Source [local] .AlarmGroup [AlarmText_02] .ID [1311:91]; Unwinder:Accu level太小,不适合自动拼接;拆卷器:自动拼接的蓄存器级别过小;AbwickFüllstandzukleinfürAutospleiss; 291 ;;巻出装置:自动纸継を行ををを

我正在尝试获取上面提到的csv内容:

csv文件保存为Unicode文本。它有中文,德文,日文。 我无法以正确的格式获取外语。

CSV阅读器代码

header('Content-Type: text/html; charset=utf-8');
$row = 1;
$up_file = 'text_SHOT_S.csv';
setlocale(LC_ALL, 'en_US.UTF-8');
if (($handle = fopen($up_file, "r")) !== FALSE) {   
     while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
        $num = count($data);
        $row++;
        for ($c=0; $c < $num; $c++) {
           echo $data[$c].'<br>';
        }
    }
    fclose($handle);}

以下代码的输出:

  

iD戼㹲䔀渀氀猀猀栀栀栀栀&&&> [zh] Chinese䜀䜀䜀䜀&&&&&Hind> << Hindin [hi]戼㹲䠀碗渀搀碗⠀吀伀伀伀栀栀碗开吀䜀崀&&>日语[ja]戼㹲漀㹲挀挀嬀嬀氀漀愀氀崀⸀䄀氀愀爀洀䜀爀漀甀瀀瀀䄀氀愀洀吀攀砀琀开㈀崀⸀䤀嬀㄀㌀㄀㤀㰀&Un Un&gt; Unwinder:Accu位置差异太大。检查层压板断裂戼㹲였睢桓ᩖ⃿쐀墄桛䵖湏읝➏ə‰쀀1࡙䝔偲⽧♦ⵔ굎㱥牢&GT; Laminatspeicher:祖GROSSEPositionsänderung - 奥夫Laminatrissprüfen戼㹲㈀㤀㰀牢&GT;戼㹲FF艹앑沩㩿ꈀ괰فم뼰فم䴰湏湿䱝✰䵙夰丰縰夰Ȱ‰촰فم젰䰰쨰豘是䐰樰䐰䬰먰赸垊是估怰唰䐰ര㰀牢&GT;来源[本地] .AlarmGroup [AlarmText_02] .ID [1311:91]戼㹲唀渀眀碗渀搀攀爀㨀䄀挀挀甀氀攀瘀攀氀琀漀漀猀洀愀氀氀昀漀爀愀甀琀猀瀀氀碗挀攀㰀牢&>拆卷器:自动拼接的蓄存器级别过小戼㹲䄀恋眀碗挀欀氀爀爀㨀䄀欀欀䘀ئئج氀氀猀猀愀渀搀稀甀欀氀攀碗渀昀ئج爀䄀甀琀漀猀瀀氀攀碗猀猀㰀牢&GT; 291戼㹲㰀牢&GT;巻出装置:自动纸継を行うにはアキュムレーターのレベルが小さすぎます戼㹲㰀牢

我要么检查垃圾字符,要么检查大部分内容转换为中文。 还尝试了header('Content-Type: text/html; charset=iso-8859-1')setlocale(LC_CTYPE, 'zh_CN.UTF-8','zh_ZH.big5');

我希望输出与CSV内容相同。

提前致谢。

2 个答案:

答案 0 :(得分:1)

请在阅读本答案之前阅读不同的内容。

Mudassir,你可以看到与龟的确切字符集,文件比较器(见img)enter image description here

你的软件使用不是utf-8而是utf-16编码。如果您无法更改此内容,则可以使用http://php.net/manual/en/function.mb-convert-encoding.php http://php.net/manual/fr/mbstring.supported-encodings.php

我尝试使用您的文件和此功能,并且它正常工作。见代码:

header('Content-Type: text/html; charset=utf-8');
$row = 1;
$up_file = 'text_SHOT_S.csv';
setlocale(LC_ALL, 'en_US.UTF-8');
if (($handle = fopen($up_file, "r")) !== FALSE) {   
     while (($data = fgetcsv($handle, 1000, ";")) !== FALSE) {
        $num = count($data);
        $row++;
        for ($c=0; $c < $num; $c++) {
           // echo $data[$c].'<br>';
           echo mb_convert_encoding($data[$c],'utf8','utf-16').'<br>';
        }
    }
    fclose($handle);}

答案 1 :(得分:1)

为了阅读CSV内容,我使用PHPExcel并将UTF-16文件转换为UTF-8,然后它将正确获取中文内容。

请参阅以下链接,将UTF-16文件转换为UTF-8。

How to Convert an UTF-16 File to an UTF-8 file using PHP

  

要转换文件,只需调用convert_file_to_utf8()函数即可   并传递您要转换的文件的文件路径。该   函数然后使用PHP函数file_get_contents()打包   将文件的内容输入到字符串变量中,然后传递给它   主转换器函数将字符串从UTF-16转换为   必要时使用UTF-8编码。最后,它使用file_put_contents()来   将结果字符串填充回原始文件,覆盖   原始文件内容。

function utf16_to_utf8($str) {

    $c0 = ord($str[0]);
    $c1 = ord($str[1]);

    if ($c0 == 0xFE && $c1 == 0xFF) {
        $be = true;
    } else if ($c0 == 0xFF && $c1 == 0xFE) {
        $be = false;
    } else {
        return $str;
    }

    $str = substr($str, 2);
    $len = strlen($str);
    $dec = '';
    for ($i = 0; $i < $len; $i += 2) {
        $c = ($be) ? ord($str[$i]) << 8 | ord($str[$i + 1]) :
                ord($str[$i + 1]) << 8 | ord($str[$i]);
        if ($c >= 0x0001 && $c <= 0x007F) {
            $dec .= chr($c);
        } else if ($c > 0x07FF) {
            $dec .= chr(0xE0 | (($c >> 12) & 0x0F));
            $dec .= chr(0x80 | (($c >> 6) & 0x3F));
            $dec .= chr(0x80 | (($c >> 0) & 0x3F));
        } else {
            $dec .= chr(0xC0 | (($c >> 6) & 0x1F));
            $dec .= chr(0x80 | (($c >> 0) & 0x3F));
        }
    }
    return $dec;
}

function convert_file_to_utf8($csvfile) {

    $utfcheck = file_get_contents($csvfile);
    $utfcheck = utf16_to_utf8($utfcheck);
    file_put_contents($csvfile, $utfcheck);
}