0

最近友達と一緒に完成させたウェブサイトには、画像やテキストファイルをアップロードできるギャラリーがあります。(開発を容易にするために)受け入れられる唯一のテキストファイルは.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、および省略記号を、出力用に通常の同等のASCIIに変換する一般的な方法です。

このコードは、アップロードされたファイルがANSI/us-asciiであるという条件の下で完全に機能します。

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

ファイルがUTF-8の場合、Webブラウザーでファイル自体を表示することは正常に機能しますが、このコードを使用してWebインターフェイスを介してファイルを印刷することはできません。この場合、スマートクォートはある種のアクセントのある文字になります。

これは私が立ち往生しているところです。Webページの出力エンコーディングはUTF-8であり、WebブラウザはそれをUTF-8として認識し、ファイルはUTF-8にありますが、スマートクォートの置換は機能せず、Webブラウザはそれらを正しく表示しません。

これに関するありとあらゆる助けをいただければ幸いです。

4

2 に答える 2

1

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

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

ヒューリスティックを使用して、ファイルがUTF-8(BOMが存在することが確実な場合は、BOMが適切な方法です)またはWindows-1252などでエンコードされているかどうかを判断することをお勧めします。そうでない場合は、UTF-8に変換します。その場合、文字を置き換える必要はなく、スマートクォートを保持できます。

于 2010-06-19T16:42:34.610 に答える
0

置き換えようとしている文字は、UTF8で異なるバイト値を持っています。実際には、UTF8にはそれぞれ1バイト以上あります。Windowsエンコーディング値を使用してそれらを検索しようとしているため、それらが見つかりません。

文字のUTF8バイトシーケンスを検索し、それらを検索に使用します。

于 2010-06-19T16:29:34.377 に答える