PHP Microsoft kodlanmış tırnak nasıl değiştirilir

6 Cevap php

Ben benim uygulamada bir kodlama sorunu için düzenli tırnak ('ve ") tek Microsoft Word sürümünü ve çift tırnak imi (“ ” ‘ ’) değiştirmeniz gerekiyor. Ben HTML kişiler olmalarını gerekir ve ben yok benim veritabanı şemasını değiştirmek olamaz.

Normal bir ifade ya da ilişkili bir dizi ya da kullanmak için: İki seçeneğiniz var.

Bunu yapmak için daha iyi bir yolu var mı?

6 Cevap

Eğer sadece birkaç belirli ve iyi tanımlanmış karakterleri değiştirmek istediğiniz göz önüne alındığında, ben str_replace bir dizi ile gitmek istiyorum: Eğer tabii ki ağır topçu regex gerekmez getirecektir ;-)

Eğer diğer bazı özel karakterleri (kelime lanet kopyala-yapıştır ...) karşılaşırsanız eğer tanımlanır zaman / Gerektiği zaman Ve, sadece bu diziye ekleyebilirsiniz.


EDIT : the best answer I can give to your comment is probably this link :
Convert Smart Quotes with PHP

Ve ilişkili kod (quoting that page):

function convert_smart_quotes($string) 
{ 
    $search = array(chr(145), 
                    chr(146), 
                    chr(147), 
                    chr(148), 
                    chr(151)); 

    $replace = array("'", 
                     "'", 
                     '"', 
                     '"', 
                     '-'); 

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

(I don't have MS word on this computer, so I can't test by myself)

Sanırım işten (I was not the one having to deal with that kind of input) kullanılan tam olarak ne hatırlamıyorum, ama şeyler aynı tür ...

Ben bu soruya bir cevap bulduk. Siz php iconv() işlevini kullanarak kod sadece bir satır gerekir:

// replace Microsoft Word version of single  and double quotations marks (“ ” ‘ ’) with  regular quotes (' and ")
$output = iconv('UTF-8', 'ASCII//TRANSLIT', $input);     

Biz, aşağıdaki kullanılır. Daha birkaç özel karakterler ile ilgilenir.

$text = str_replace(chr(130), ',', $text);    // baseline single quote
$text = str_replace(chr(132), '"', $text);    // baseline double quote
$text = str_replace(chr(133), '...', $text);  // ellipsis
$text = str_replace(chr(145), "'", $text);    // left single quote
$text = str_replace(chr(146), "'", $text);    // right single quote
$text = str_replace(chr(147), '"', $text);    // left double quote
$text = str_replace(chr(148), '"', $text);    // right double quote

$text = mb_convert_encoding($text, 'HTML-ENTITIES', 'UTF-8');

Benim gibi sizin CMS veya RTE için garip şeyler yapıyor ve iconv çalışmıyor kırık ASCII / ms word karakter muazzam bir dizi burada gelirseniz, o zaman bu deli fonksiyon sadece sizin için olabilir.

Make sure your encoding is utf-8 when you save this function to a file.

<?php
/**
 * fixMSWord
 *
 * Replace ascii chars with utf8. Note there are ascii characters that don't 
 * correctly map and will be replaced by spaces.
 *
 * @author      Robin Cafolla
 * @date        2013-03-22
 * @Copyright   (c) 2013 Robin Cafolla
 * @licence     MIT (x11) http://opensource.org/licenses/MIT
 */
function fixMSWord($string) {
    $map = Array(
        '33' => '!', '34' => '"', '35' => '#', '36' => '$', '37' => '%', '38' => '&', '39' => "'", '40' => '(', '41' => ')', '42' => '*', 
        '43' => '+', '44' => ',', '45' => '-', '46' => '.', '47' => '/', '48' => '0', '49' => '1', '50' => '2', '51' => '3', '52' => '4', 
        '53' => '5', '54' => '6', '55' => '7', '56' => '8', '57' => '9', '58' => ':', '59' => ';', '60' => '<', '61' => '=', '62' => '>', 
        '63' => '?', '64' => '@', '65' => 'A', '66' => 'B', '67' => 'C', '68' => 'D', '69' => 'E', '70' => 'F', '71' => 'G', '72' => 'H', 
        '73' => 'I', '74' => 'J', '75' => 'K', '76' => 'L', '77' => 'M', '78' => 'N', '79' => 'O', '80' => 'P', '81' => 'Q', '82' => 'R', 
        '83' => 'S', '84' => 'T', '85' => 'U', '86' => 'V', '87' => 'W', '88' => 'X', '89' => 'Y', '90' => 'Z', '91' => '[', '92' => '\\', 
        '93' => ']', '94' => '^', '95' => '_', '96' => '`', '97' => 'a', '98' => 'b', '99' => 'c', '100'=> 'd', '101'=> 'e', '102'=> 'f', 
        '103'=> 'g', '104'=> 'h', '105'=> 'i', '106'=> 'j', '107'=> 'k', '108'=> 'l', '109'=> 'm', '110'=> 'n', '111'=> 'o', '112'=> 'p', 
        '113'=> 'q', '114'=> 'r', '115'=> 's', '116'=> 't', '117'=> 'u', '118'=> 'v', '119'=> 'w', '120'=> 'x', '121'=> 'y', '122'=> 'z', 
        '123'=> '{', '124'=> '|', '125'=> '}', '126'=> '~', '127'=> ' ', '128'=> '&#8364;', '129'=> ' ', '130'=> ',', '131'=> ' ', '132'=> '"', 
        '133'=> '.', '134'=> ' ', '135'=> ' ', '136'=> '^', '137'=> ' ', '138'=> ' ', '139'=> '<', '140'=> ' ', '141'=> ' ', '142'=> ' ', 
        '143'=> ' ', '144'=> ' ', '145'=> "'", '146'=> "'", '147'=> '"', '148'=> '"', '149'=> '.', '150'=> '-', '151'=> '-', '152'=> '~', 
        '153'=> ' ', '154'=> ' ', '155'=> '>', '156'=> ' ', '157'=> ' ', '158'=> ' ', '159'=> ' ', '160'=> ' ', '161'=> '¡', '162'=> '¢', 
        '163'=> '£', '164'=> '¤', '165'=> '¥', '166'=> '¦', '167'=> '§', '168'=> '¨', '169'=> '©', '170'=> 'ª', '171'=> '«', '172'=> '¬', 
        '173'=> '­', '174'=> '®', '175'=> '¯', '176'=> '°', '177'=> '±', '178'=> '²', '179'=> '³', '180'=> '´', '181'=> 'µ', '182'=> '¶', 
        '183'=> '·', '184'=> '¸', '185'=> '¹', '186'=> 'º', '187'=> '»', '188'=> '¼', '189'=> '½', '190'=> '¾', '191'=> '¿', '192'=> 'À', 
        '193'=> 'Á', '194'=> 'Â', '195'=> 'Ã', '196'=> 'Ä', '197'=> 'Å', '198'=> 'Æ', '199'=> 'Ç', '200'=> 'È', '201'=> 'É', '202'=> 'Ê', 
        '203'=> 'Ë', '204'=> 'Ì', '205'=> 'Í', '206'=> 'Î', '207'=> 'Ï', '208'=> 'Ð', '209'=> 'Ñ', '210'=> 'Ò', '211'=> 'Ó', '212'=> 'Ô', 
        '213'=> 'Õ', '214'=> 'Ö', '215'=> '×', '216'=> 'Ø', '217'=> 'Ù', '218'=> 'Ú', '219'=> 'Û', '220'=> 'Ü', '221'=> 'Ý', '222'=> 'Þ', 
        '223'=> 'ß', '224'=> 'à', '225'=> 'á', '226'=> 'â', '227'=> 'ã', '228'=> 'ä', '229'=> 'å', '230'=> 'æ', '231'=> 'ç', '232'=> 'è', 
        '233'=> 'é', '234'=> 'ê', '235'=> 'ë', '236'=> 'ì', '237'=> 'í', '238'=> 'î', '239'=> 'ï', '240'=> 'ð', '241'=> 'ñ', '242'=> 'ò', 
        '243'=> 'ó', '244'=> 'ô', '245'=> 'õ', '246'=> 'ö', '247'=> '÷', '248'=> 'ø', '249'=> 'ù', '250'=> 'ú', '251'=> 'û', '252'=> 'ü', 
        '253'=> 'ý', '254'=> 'þ', '255'=> 'ÿ'
    );

    $search = Array();
    $replace = Array();

    foreach ($map as $s => $r) {
        $search[] = chr((int)$s);
        $replace[] = $r;
    }

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

Gumbo en @ dışında önceki cevapların her biri Unicode dizeleri cendereye olacaktır:

echo convert_smart_quotes("This is Yi: ꑑ. Point ⒒ this breaks Yi. Yi broke–why? I need a longer––point. This makes Han 嗗 mad.");

Sonuçlar:

This is Yi: ?''. Point ?'' this breaks Yi. Yi broke?"why? I need a longer?"?"point. This makes Han ?-- mad.

Iconv:

$output = iconv('UTF-8', 'ASCII//TRANSLIT', $input);

Sonuçlar:

PHP Notice: iconv(): Detected an illegal character in input string in php shell code on line 1

Sen karakterleri kaldırmak, hangi //IGNORE olarak değiştirin, ancak bunları çeviremiyor.

Bu CP1252 kodlanmış Microsoft tırnak değiştirmek için en iyi yoldur. Onlar Unicode ve bunları değiştirmeniz gerekiyorsa, Gumbo cevabını kullanın:

function convert_cp1252_to_ascii($input, $default = '') {
    if ($input === null || $input == '') {
        return $default;
    }

    // https://en.wikipedia.org/wiki/UTF-8
    // https://en.wikipedia.org/wiki/ISO/IEC_8859-1
    // https://en.wikipedia.org/wiki/Windows-1252
    // http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1252.TXT
    $encoding = mb_detect_encoding($input, array('Windows-1252', 'ISO-8859-1'), true);
    if ($encoding == 'ISO-8859-1' || $encoding == 'Windows-1252') {
        /*
         * Use the search/replace arrays if a character needs to be replaced with
         * something other than its Unicode equivalent.
         */ 

        $replace = array(
            128 => "E",     // http://www.fileformat.info/info/unicode/char/20AC/index.htm EURO SIGN
            129 => "",              // UNDEFINED
            130 => ",",     // http://www.fileformat.info/info/unicode/char/201A/index.htm SINGLE LOW-9 QUOTATION MARK
            131 => "f",     // http://www.fileformat.info/info/unicode/char/0192/index.htm LATIN SMALL LETTER F WITH HOOK
            132 => ",,",        // http://www.fileformat.info/info/unicode/char/201e/index.htm DOUBLE LOW-9 QUOTATION MARK
            133 => "...",       // http://www.fileformat.info/info/unicode/char/2026/index.htm HORIZONTAL ELLIPSIS
            134 => "t",     // http://www.fileformat.info/info/unicode/char/2020/index.htm DAGGER
            135 => "T",     // http://www.fileformat.info/info/unicode/char/2021/index.htm DOUBLE DAGGER
            136 => "^",     // http://www.fileformat.info/info/unicode/char/02c6/index.htm MODIFIER LETTER CIRCUMFLEX ACCENT
            137 => "%",     // http://www.fileformat.info/info/unicode/char/2030/index.htm PER MILLE SIGN
            138 => "S",     // http://www.fileformat.info/info/unicode/char/0160/index.htm LATIN CAPITAL LETTER S WITH CARON
            139 => "<",     // http://www.fileformat.info/info/unicode/char/2039/index.htm SINGLE LEFT-POINTING ANGLE QUOTATION MARK
            140 => "OE",        // http://www.fileformat.info/info/unicode/char/0152/index.htm LATIN CAPITAL LIGATURE OE
            141 => "",              // UNDEFINED
            142 => "Z",     // http://www.fileformat.info/info/unicode/char/017d/index.htm LATIN CAPITAL LETTER Z WITH CARON 
            143 => "",              // UNDEFINED
            144 => "",              // UNDEFINED
            145 => "'",     // http://www.fileformat.info/info/unicode/char/2018/index.htm LEFT SINGLE QUOTATION MARK 
            146 => "'",     // http://www.fileformat.info/info/unicode/char/2019/index.htm RIGHT SINGLE QUOTATION MARK
            147 => "\"",        // http://www.fileformat.info/info/unicode/char/201c/index.htm LEFT DOUBLE QUOTATION MARK
            148 => "\"",        // http://www.fileformat.info/info/unicode/char/201d/index.htm RIGHT DOUBLE QUOTATION MARK
            149 => "*",     // http://www.fileformat.info/info/unicode/char/2022/index.htm BULLET
            150 => "-",     // http://www.fileformat.info/info/unicode/char/2013/index.htm EN DASH
            151 => "--",        // http://www.fileformat.info/info/unicode/char/2014/index.htm EM DASH
            152 => "~",     // http://www.fileformat.info/info/unicode/char/02DC/index.htm SMALL TILDE
            153 => "TM",        // http://www.fileformat.info/info/unicode/char/2122/index.htm TRADE MARK SIGN
            154 => "s",     // http://www.fileformat.info/info/unicode/char/0161/index.htm LATIN SMALL LETTER S WITH CARON
            155 => ">",     // http://www.fileformat.info/info/unicode/char/203A/index.htm SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
            156 => "oe",        // http://www.fileformat.info/info/unicode/char/0153/index.htm LATIN SMALL LIGATURE OE
            157 => "",              // UNDEFINED
            158 => "z",     // http://www.fileformat.info/info/unicode/char/017E/index.htm LATIN SMALL LETTER Z WITH CARON
            159 => "Y",     // http://www.fileformat.info/info/unicode/char/0178/index.htm LATIN CAPITAL LETTER Y WITH DIAERESIS
        );

        $find = array();
        foreach (array_keys($replace) as $key) {
            $find[] = chr($key);
        }

        $input = str_replace($find, array_values($replace), $input);
        /*
         * Because ISO-8859-1 and CP1252 are identical except for 0x80 through 0x9F
         * and control characters, always convert from Windows-1252 to UTF-8.
         */
        $input = iconv('Windows-1252', 'UTF-8//IGNORE', $input);
    }
    return $input;
}

Bazı değişikliklerle, this answer alınmıştır. Bulmak ne üzerinde kontrol etmek istiyorsanız /, yerine bu işlevi kullanın.