2011-09-14 14 views
12

Próbuję przekonwertować tekst Word wklejony przez użytkowników, które zawierają elipsę MS Word i długą kreskę przed dalszym przetwarzaniem.Konwertowanie znaków specjalnych programu Microsoft Word na PHP

Znalazłem stare proponowane rozwiązanie tutaj na problem http://www.codingforums.com/archive/index.php/t-47163.html, ale to nie działa dla mnie. Po wymianie elipsy na przykład zmienna wraca jako pusta. Nigdy wcześniej nie widziałem czegoś takiego:

$src = "Long word dash – and weird Word ellipsis…"; 
$src = str_replace("‘", "'", $src); 
$src = str_replace("’", "'", $src); 
$src = str_replace("”", '"', $src); 
$src = str_replace("“", '"', $src); 
$src = str_replace("–", "-", $src); 
$src = str_replace("…", "...", $src); 
print $src; 

Jakieś pomysły?

+0

Zobacz moją odpowiedź na to pytanie [**] (http://stackoverflow.com/questions/6698785/modify-simplify-topic-title-for-displaying-in-url) **. Nie będzie to dotyczyć wszystkich scenariuszy, ale powinno obsługiwać najczęstsze. – simshaun

+0

Zdałem sobie sprawę, że kodowanie mojego pliku php to ANSI, a mysql ma również kodowanie ogólne non utf8. Poprawienie ich, mojej funkcji i poniższej działa. Bardzo doceniane od wszystkich. – giorgio79

Odpowiedz

30

Dla każdego, coraz diament znak zapytania w PHP, to metoda zastępowania znaków UTF-8 działa lepiej niż przy użyciu funkcji Chr.

$search = [     // www.fileformat.info/info/unicode/<NUM>/ <NUM> = 2018 
       "\xC2\xAB",  // « (U+00AB) in UTF-8 
       "\xC2\xBB",  // » (U+00BB) in UTF-8 
       "\xE2\x80\x98", // ‘ (U+2018) in UTF-8 
       "\xE2\x80\x99", // ’ (U+2019) in UTF-8 
       "\xE2\x80\x9A", // ‚ (U+201A) in UTF-8 
       "\xE2\x80\x9B", // ‛ (U+201B) in UTF-8 
       "\xE2\x80\x9C", // “ (U+201C) in UTF-8 
       "\xE2\x80\x9D", // ” (U+201D) in UTF-8 
       "\xE2\x80\x9E", // „ (U+201E) in UTF-8 
       "\xE2\x80\x9F", // ‟ (U+201F) in UTF-8 
       "\xE2\x80\xB9", // ‹ (U+2039) in UTF-8 
       "\xE2\x80\xBA", // › (U+203A) in UTF-8 
       "\xE2\x80\x93", // – (U+2013) in UTF-8 
       "\xE2\x80\x94", // — (U+2014) in UTF-8 
       "\xE2\x80\xA6" // … (U+2026) in UTF-8 
    ]; 

    $replacements = [ 
       "<<", 
       ">>", 
       "'", 
       "'", 
       "'", 
       "'", 
       '"', 
       '"', 
       '"', 
       '"', 
       "<", 
       ">", 
       "-", 
       "-", 
       "..." 
    ]; 

    str_replace($search, $replacements, $string); 
+0

Stary, dziękuję. Nie wiem, co się dzieje z jedną z bibliotek parsujących HTML, ale wszystkie wydają się pluć z powrotem nieprzyjemnymi znakami zastępczymi ... Myślę, że zakładają, że kodowanie to domyślnie ISO-8859-1. – Funktr0n

+0

Dzięki Verron! Właśnie zauważyłem, że adres URL pliku powinien być www.fileformat.info/info/unicode/char/ / – user697576

+0

Szczęśliwy, że mogę pomóc! Żadne inne rozwiązanie nie działało na poziomie 100, więc pomyślałem, że podzielę się tym. –

8

Hmm. Używam tej funkcji do odkażania tekstu skopiowanego do RTE. Może w tym przypadku działać lub nie. Konwertuje się na elementy HTML, ale można je zmodyfikować, aby konwertować zwykłe znaki:

function convertFromCP1252($string) 
{ 
    $search = array('&', 
        '<', 
        '>', 
        '"', 
        chr(212), 
        chr(213), 
        chr(210), 
        chr(211), 
        chr(209), 
        chr(208), 
        chr(201), 
        chr(145), 
        chr(146), 
        chr(147), 
        chr(148), 
        chr(151), 
        chr(150), 
        chr(133), 
        chr(194) 
       ); 

    $replace = array( '&amp;', 
         '&lt;', 
         '&gt;', 
         '&quot;', 
         '&#8216;', 
         '&#8217;', 
         '&#8220;', 
         '&#8221;', 
         '&#8211;', 
         '&#8212;', 
         '&#8230;', 
         '&#8216;', 
         '&#8217;', 
         '&#8220;', 
         '&#8221;', 
         '&#8211;', 
         '&#8212;', 
         '&#8230;', 
         '' 
        ); 

    return str_replace($search, $replace, $string); 
} 
5

Świetne rozwiązanie. Skopiowałem i wkleiłem to i zadziałało z problemem. Podczas dalszych badań dodałem kilka znaków, które nie znajdowały się w tablicy wyszukiwania i zamiany. W celu znalezienia numery identyfikacyjne znaków ASCII, napisałem funkcję PHP, który pokazuje, jaka jest liczba znaków ASCII:

function stdump($s){ 

    for($i=0;$i<strlen($s);$i++){ 

    echo substr($s,$i,1) . "(" . ord(substr($s,$i,1)) . ")"; 

    } 

    echo "<br/>"; 
} 

znak jest wyświetlacz i obok niego numer ASCII jest pokaz w nawiasach. W ten sposób:

echo stdump ("GPUs");

sporządza:

G (71) P (80) U (85) S (115), A (226) € (128) | (166)

nadzieja pomaga.

--Keith

Powiązane problemy