Frage

Eine Website, die ich vor kurzem mit einem Freund abgeschlossen hat eine Galerie, wo man Bilder und Textdateien hochladen kann. Die einzige akzeptierte Textdatei (auf einfache Entwicklung) ist .txt und geht in der Regel ohne Probleme aus (oder nicht ..)

Die Probleme, die ich je gesehen habe sind die gleichen jeder Entwickler. Microsoft Extended ASCII

Bevor Sie den Text aus der Datei ausgibt, ich mehrere verschiedene Schichten übergehen, um zu versuchen, es zu bereinigen:

$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");

Die str_replace ist die allgemeine Methode Microsofts schrecklich typografische Anführungszeichen umzuwandeln, em-dash und Ellipsen in ihren normalen ASCII-Äquivalente für die Ausgabe.

Dieser Code funktioniert perfekt unter der Bedingung, dass die Datei hochgeladen ist ANSI / us-ascii.

Dieser Code funktioniert nicht (ohne besonderen Grund), wenn die hochgeladene Datei UTF-8 ist.

Wenn die Datei UTF-8 ist, sieht die Datei selbst im Web-Browser funktioniert gut, aber es aus über das Web-Interface Druck mit diesem Code nicht. In diesem Fall werden die typografischen Anführungszeichen eine Art Akzent eines Zeichens.

Dies ist, wo ich bin stecken. Der Ausgang kodiert für die Webseite ist UTF-8, der Web-Browser als UTF-8 sieht, ist die Datei in UTF-8 und doch weder die für die typographischen Arbeiten ersetzt auch nicht die Web-Browser-Anzeige, sie richtig.

Jede und alle Hilfe auf diesem würde sehr geschätzt werden.

War es hilfreich?

Lösung

Wenn ich das richtig verstehen Ihr Problem ist, dass der Code, dass ersetzt „erweitert ASCII“ Zeichen für ihre ASCII-Pendants schlagen fehl, wenn der Benutzer eine Datei in UTF-8.

Dies war zu erwarten. Sie können nicht auf UTF-8-Dateien mit str_replace arbeiten und dergleichen, die auf Byte-Ebene arbeiten, während ein Zeichen in UTF-8 um ein Byte für Zeichen im ASCII-Bereich nur gebildet ist.

Was würde ich empfehlen, Sie zu tun, eine Heuristik zu verwenden, um zu bestimmen, ob die Datei in UTF-8 codiert ist (die BOM ist ein guter Weg, wenn Sie sicher sind, wird es vorhanden sein) oder Windows-1252 oder was auch immer und dann wandeln sie in UTF-8, wenn es nicht ist. In diesem Fall würden Sie keine Zeichen ersetzen müssen, könnten Sie die typografischen Anführungszeichen erhalten.

Andere Tipps

Die Zeichen, die Sie versuchen, verschiedene Byte-Werte in UTF8 haben zu ersetzen. Eigentlich haben sie mehr als ein Byte jeweils in UTF8. Sie versuchen, sie mit Windows-Kodierung Werte und das ist zu suchen, warum Sie sie nicht finden werden.

die UTF8-Byte-Sequenzen der Zeichen nachschlagen und sie für die Suche verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top