質問

私が最近完成したウェブサイトには、画像やテキストファイルをアップロードできるギャラリーがあります。唯一の受け入れられたテキストファイル(開発を容易にするため)は.txtであり、通常はヒッチなしで消えます(またはそうではありません。)

私が遭遇した問題は、どの開発者でも同じです:Microsoftの拡張ASCII。

ファイルからテキストを出力する前に、いくつかの異なるレイヤーを介してそれをきれいにしようとします。

$txtfile = file_get_contents(".".$this->var['submission']['file_loc']);

// BOM Fun
    $boms = array
    (
        "utf8"    => array(3,pack("CCC",0xEF,0xBB,0xBF)),
        "utf16be"       => array(2,pack("CC",0xFE,0xFF)),
        "utf16le"       => array(2,pack("CC",0xFF,0xFE)),
        "utf32be"       => array(4,pack("CCCC",0x00,0x00,0xFE,0xFF)),
        "utf32le"       => array(4,pack("CCCC",0xFF,0xFE,0x00,0x00)),
        "gb18030"       => array(4,pack("CCCC",0x84,0x31,0x95,0x33))
    );
    foreach($boms as $bom)
    {
        if(mb_substr($txtfile,0,$bom[0]) == $bom[1])
        {
            $txtfile = substr($txtfile,$bom[0]);
            break;
        }
    }
$txtfile_o = $txtfile;
$badwords = array(chr(145),chr(146),chr(147),chr(148),chr(151),chr(133));
$fixwords = array("'","'",'"','"','-','...');
$txtfile_o = str_replace($badwords,$fixwords,$txtfile_o);
$txtfile_o = mb_convert_encoding($txtfile_o,"UTF-8");

STR_REPLACEは、Microsoftのひどいスマートな引用、Em-Dash、およびEllipsisを出力の通常のASCII相当物に変換する一般的な方法です。

このコードは、アップロードされたファイルがANSI / US-ASCIIであるという条件の下で完全に見つかります。

アップロードされたファイルがUTF-8の場合、このコードは(特に理由なしに)機能しません。

ファイルがUTF-8の場合、Webブラウザでファイル自体を表示すると正常に動作しますが、このコードを使用してWebインターフェイスを介して印刷してもはわかりません。このイベントでは、スマートな引用は、ある種のキャラクターを強調します。

これは私が立ち往生しているところです。 Webページの出力エンコードはUTF-8、WebブラウザはそれをUTF-8と見なし、ファイルはUTF-8であると見なしますが、スマート引用符の置換は機能しませんし、Webブラウザが正しく表示しません。

これに関するすべての助けは大歓迎です。

役に立ちましたか?

解決

私が正しく理解している場合、あなたの問題は、ユーザーがUTF-8でファイルを送信すると、ASCIIのカウンターパートの「拡張ASCII」文字を置き換えるコードが失敗することです。

これは予想されていました。 UTF-8ファイルで操作することはできません str_replace バイトレベルで動作するのは、UTF-8の文字はASCII範囲の文字に対してのみ1つのバイトで構成されます。

私があなたにすることをお勧めすることは、いくつかのヒューリスティックを使用して、ファイルがUTF-8でエンコードされているかどうかを判断することです(BOMは存在すると確信している場合は良い方法です)またはWindows-1252などそうでない場合は、UTF-8に変換します。その場合、キャラクターを交換する必要はありません。スマートの引用を保存できます。

他のヒント

交換しようとしている文字は、UTF8に異なるバイト値を持っています。実際、彼らはそれぞれUTF8に複数のバイトを持っています。あなたはウィンドウをエンコードする値でそれらを検索しようとしているので、それがあなたがそれらを見つけることができない理由です。

文字のUTF8バイトシーケンスを調べて、検索に使用します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top