Nano Hash - криптовалюты, майнинг, программирование

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

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

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

Есть лучший способ сделать это?


  • ИМО, лучший ответ специально для умной обработки кавычек находится здесь: stackoverflow.com/a/21491305/597034 18.09.2019

Ответы:


1

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

И если вы столкнетесь с некоторыми другими специальными символами (проклятый копипаст из 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); 
} 

(У меня на этом компьютере нет Microsoft Word, поэтому я не могу проверить это самостоятельно)

Я не помню точно, что мы использовали на работе (мне не приходилось иметь дело с таким входом), но это были такие же вещи...

11.08.2009
  • Как бы вы указали символы MS? 11.08.2009
  • Это то, что я искал. Спасибо. Массив поиска не работал как есть, в итоге я использовал версию Hex, предоставленную в комментариях по ссылке, которую вы дали выше. 11.08.2009
  • Знак «&», скопированный из слова MS, не кодируется должным образом, мы можем использовать этот фрагмент для кодирования этого в «». (а также пули и другие символы) 06.10.2009
  • Для других пользователей: вы можете найти chr(149) (маркер) и заменить его звездочкой. Эта страница имеет список нескольких символов chr(), которые вы, возможно, захотите преобразовать. 22.06.2012
  • Вы не проверяете сначала кодировку строки, поэтому эта функция будет искажать определенный Unicode, переданный в нее. 23.04.2014
  • после того, как я рвал на себе волосы, пытаясь понять мои проблемы с кодировкой, в конечном итоге это был билет для меня. я использовал это (php.net/manual/en/function.chr.php), чтобы расширить вашу функцию для моих собственных целей - прокрутите наполовину вниз до примера, опубликованного Джошем Б. 17.05.2018

  • 2

    Я нашел ответ на этот вопрос. Вам нужна всего одна строка кода, использующая функцию iconv() в php:

    // replace Microsoft Word version of single  and double quotations marks (“ ” ‘ ’) with  regular quotes (' and ")
    $output = iconv('UTF-8', 'ASCII//TRANSLIT', $input);     
    
    07.07.2011
  • если мой ответ помог, вы можете поддержать мой первоначальный вопрос stackoverflow.com/questions/6597268/ 14.05.2012
  • Спасибо, однако в моем случае мне нужно было выбрать правильную кодировку символов (которая была CP1252, а не UTF-8): $output = iconv('CP1252', 'ASCII//TRANSLIT', $input); 18.07.2012
  • @eric приятно знать, что ты использовал свой разум для других. Спасибо, что поделился :) 08.08.2012
  • Да, это сработало для меня. Я бы рекомендовал это вместо принятого ответа :) 24.11.2013
  • Это работает для меня, а принятый ответ - нет. Я хотел бы изменить этот ответ на принятый. 01.02.2014
  • Но являются ли кавычки Microsoft кодовыми точками Unicode или кодовыми точками CP1252? Если последнее, это решение не будет работать. На самом деле, он выдаст уведомление: PHP Notice: iconv(): Detected an illegal character in input string in php shell code on line 1. 23.04.2014
  • Сработало без нареканий, спасибо! я использую кодировку UTF-8, файлы закодированы, а также utf8-bin в базе данных... спасибо! 21.04.2017
  • Это кажется хорошим (или ленивым) решением моей проблемы в Zen Cart, клиенты вводят фигурные кавычки в свои имена при регистрации, а ZC сохраняет имя и фамилию в сеансе PHP, которые затем не могут быть декодированы с помощью PHP Warning: session_start (): Не удалось декодировать объект сеанса. Сообщение о сеансе уничтожено. Я собираюсь обойти это, удалив строки с помощью iconv, прежде чем сохранять их в базе данных во время создания учетной записи. 21.08.2018
  • ПРЕДУПРЕЖДЕНИЕ: iconv — это расширение PHP, и его нельзя устанавливать в рабочей среде! Fatal error: Call to undefined function iconv() Обязательно протестируйте свой код на каждой платформе, которую он должен запускать. 22.08.2018
  • Это хороший трюк. но я заметил, что это решение удаляет специальные символы, такие как é, è, à, â и другие. Любое решение, чтобы уклониться от проблемы? 14.10.2019

  • 3

    Ваши кавычки, закодированные Microsoft, вероятно, являются типографскими кавычками . Вы можете просто заменить их на str_replace, если знаете кодировку строки, в которой хотите их заменить.

    Вот пример для UTF-8, но с использованием одного массива сопоставления с strtr:

    $quotes = array(
        "\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
    );
    $str = strtr($str, $quotes);
    

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

    11.08.2009
  • Не могли бы вы вместо уродливых экранов \x просто включить буквальные символы в исходный файл? 03.10.2010
  • @R..: Вот в чем проблема: многие недостаточно знают о кодировках символов и/или о том, какую кодировку символов они используют. 03.10.2010
  • сработало очарование, спасибо. Должен любить импортировать электронные таблицы Excel в mysql: S +1 01.09.2011
  • Это сработало для меня, когда принятый ответ по какой-то причине не сработал (вероятно, из-за UTF-8). Спасибо. 11.09.2014
  • @marcvangend Принятый ответ предполагает не UTF-8, а какую-то другую однобайтовую кодировку символов. 11.09.2014

  • 4

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

    При сохранении этой функции в файл убедитесь, что вы используете кодировку UTF-8.

    <?php
        /**
         * fixMSWord
         *
         * Replace ASCII chars with UTF-8. Note there are ASCII characters that don't
         * correctly map and will be replaced by spaces.
         *
         * @author      Robin Cafolla
         * @date        2013-03-22
         */
        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);
        }
    
    22.03.2013
  • Могу ли я использовать это для проекта, потому что это в лицензиях MIT 11.04.2013
  • В общем, лицензия MIT позволяет вам использовать ее так, как вам нравится, до тех пор, пока вы не удалите лицензию :) 11.04.2013
  • Вы решили поставить лицензию на то, что по сути представляет собой... массив? 07.02.2014
  • Я просто скопировал код из файла, в котором он был, и вставил сюда. Я стараюсь размещать открытые лицензии на как можно больше кода, который пишу, даже если все, что он сводится к полезному массиву. 07.02.2014
  • Неважно, какую лицензию вы указываете в ответе, весь пользовательский контент находится под лицензией cc by-sa 3.0 с указанием авторства. Вы можете увидеть это в футере. Этот код больше не находится под лицензией MIT. 23.04.2014
  • Нет, это двойная лицензия. Используйте то, что вам удобнее. 23.04.2014
  • Кроме того, я должен указать, что эта функция не исправляет ASCII. Нет символов ASCII выше 127. Единственное, что я вижу, эта функция делает, это искажает строки Unicode. 23.04.2014
  • @NobleUplift Я переименовал его в fixMSWord. Я согласен, что это искажает, но если у вас есть проблема, которую решает эта функция, она делает свою работу, и мне еще предстоит найти другое решение. 24.04.2014

  • 5

    Мы использовали следующее. Он имеет дело с еще несколькими специальными символами.

    $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');
    
    11.08.2009
  • Вы должны проверить кодировку строки $text, прежде чем запускать в ней замены. Это может быть уже строка Unicode, и вы ее искажаете. 23.04.2014

  • 6

    Каждый из предыдущих ответов, кроме Gumbo's искажает строки 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.
    

    Значок:

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

    Результат:

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

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

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

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

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

    23.04.2014
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..