Web

Как заменить кавычки в кодировке Microsoft в PHP

Мне нужно заменить в версии Microsoft Word одинарные и двойные кавычки (" " ' ' ') на обычные кавычки (' и ") из-за проблемы с кодировкой в моем приложении. Мне не нужно, чтобы они были сущностями HTML, и я не могу изменить схему базы данных.

У меня есть два варианта: использовать либо регулярное выражение, либо связанный массив. Есть ли лучший способ сделать это?

Ответ 1

Учитывая, что вы хотите заменить только несколько конкретных и хорошо идентифицированных символов, я бы выбрал str_replace с массивом: вам явно не нужны сложные конструкции, которые принесет вам regex ;-)

А если вы столкнетесь с другими специальными символами (копипаста из Microsoft Word...), вы можете просто добавить их в этот массив, когда это будет необходимо/когда они будут идентифицированы. Лучший ответ, который я могу дать на ваш вопрос, — это, вероятно, данная ссылка: Преобразование умных кавычек с помощью PHP.

И связанный с ней код (цитирование этой страницы):

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

 }  

 

 

Ответ 2

Ваши кавычки в кодировке Microsoft — это, вероятно, типографские кавычки. Вы можете просто заменить их с помощью str_replace, если знаете кодировку строки, в которой вы хотите их заменить. Вот пример для UTF-8, но с использованием одного массива отображения с помощью strtr:

$quotes = array(

    "\xC2\xAB"       => '"', // « (U+00AB) в UTF-8

    "\xC2\xBB"       => '"', // » (U+00BB) в UTF-8

    "\xE2\x80\x98" => "'", // ‘ (U+2018) в UTF-8

    "\xE2\x80\x99" => "'", // ’ (U+2019) в UTF-8

    "\xE2\x80\x9A" => "'", // ‚ (U+201A) в UTF-8

    "\xE2\x80\x9B" => "'", // ‛ (U+201B) в UTF-8

    "\xE2\x80\x9C" => '"', // “ (U+201C) в UTF-8

    "\xE2\x80\x9D" => '"', // ” (U+201D) в UTF-8

    "\xE2\x80\x9E" => '"', // „ (U+201E) в UTF-8

    "\xE2\x80\x9F" => '"', // ‟ (U+201F) в UTF-8

    "\xE2\x80\xB9" => "'", // ‹ (U+2039) в UTF-8

    "\xE2\x80\xBA" => "'", // › (U+203A) в UTF-8

);

$str = strtr($str, $quotes);

Если вам нужна другая кодировка, вы можете использовать mb_convert_encoding для преобразования ключей.

 

Ответ 3

Если вы, как и я, пришли сюда с огромным количеством сломанных символов ASCII/Microsoft Word, которые делают странные вещи с вашей CMS или RTE, а iconv не работает, то эта функция может быть как раз для вас. Убедитесь, что ваша кодировка UTF-8, когда вы сохраняете эту функцию в файл.

<?php

    /**

     * fixMSWord

     *

     * Замените символы ASCII на UTF-8. Обратите внимание, что есть символы ASCII, которые не будут

     * корректно отображаться и будут заменены пробелами.

     *

     * @author Robin Cafolla

     */

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

    }

Ответ 4

Мы использовали следующее. Этот код работает с несколькими другими специальными символами:

$text=str_replace(chr(130), ',', $text);    // Базовая одинарная кавычка

$text = str_replace(chr(132), '"', $text);    // Базовая двойная кавычка

$text = str_replace(chr(133), '...', $text);  // Многоточие

$text = str_replace(chr(145), "'", $text);    // Левая одинарная кавычка

$text = str_replace(chr(146), "'", $text);    // Правая одинарная кавычка

$text = str_replace(chr(147), '"', $text);    // Левая двойная кавычка

$text = str_replace(chr(148), '"', $text);    // Правая двойная кавычка

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

Ответ 5

Все предыдущие ответы будут искажать строки Unicode:

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

Результаты:

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

Результаты:

PHP Уведомление: iconv(): Обнаружен недопустимый символ в строке ввода в коде php shell в строке 1.

 

Вы можете изменить его на //IGNORE, что удалит символы, но не переведет их.

Это лучший способ заменить кавычки Microsoft, закодированные в CP1252. Если они в Юникоде и вам нужно их заменить, используйте:

function convert_cp1252_to_ascii($input, $default = '') {

    if ($input === null || $input == '') {

        return $default;

    }

    $encoding = mb_detect_encoding($input, array('Windows-1252', 'ISO-8859-1'), true);

    if ($encoding == 'ISO-8859-1' || $encoding == 'Windows-1252') {

        /*

         * Используйте массивы поиска/замены, если символ должен быть заменен на

         * что-то, отличное от его эквивалента в Юникоде.

         */

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

        /*

         * Поскольку ISO-8859-1 и CP1252 идентичны, за исключением 0x80 - 0x9F

         * и управляющих символов, всегда конвертируйте из Windows-1252 в UTF-8.

         */

        $input = iconv('Windows-1252', 'UTF-8//IGNORE', $input);

    }

    return $input;

}

Если вы хотите контролировать то, что вы находите/заменяете, используйте эту функцию.

 

Схожие статьи

Web

Как поднять пользование кэша Dentry

Как бесплатно проверить доступность сайта из разных частей мира?
Web

Как бесплатно проверить доступность сайта из разных частей мира?

Web

Как использовать array_filter() для фильтрации ключей массива в PHP

Web

Как запустить процесс с выводом в реальном времени в PHP

×