Как распечатать символ квадратного корня при запуске PHP-скрипта в командной строке Windows 10?

Для сценария PHP (5.6), который запускается в командной строке, я пытаюсь напечатать символ квадратного корня, но мне это не удается. Вместо этого я получаю ненужные персонажи.

Я уже прочитал множество вопросов / ответов о печати символов Юникода из PHP CLI в командную строку, но ни один из них не относится в точности к моему примеру.

Я нахожусь в Windows 10, использую стандартную командную строку (cmd.exe), которой я с удовольствием пользуюсь.

Я использую шрифт Consolas и запустил chcp 65001, чтобы установить для подсказки значение utf-8. * Также пробовали консоль Lucida *.

// Square root symbol

echo "\u221A";
echo "\xe2\x88\x9a";
echo '√';

Я пробовал iconv(), json_decode(), mb_convert_encoding() и pack() безуспешно.


person u01jmg3    schedule 13.03.2017    source источник
comment
возможный дубликат символов stackoverflow.com/ questions / 388490 /   -  person Jay Blanchard    schedule 13.03.2017
comment
@JayBlanchard, он уже использует chcp 65001, что было ответом на вопрос, который вы связали.   -  person Dimi    schedule 13.03.2017
comment
Пожалуйста, используйте   -  person user1544541    schedule 13.03.2017
comment
Вот почему я сказал «возможно» @Dimi ¯ \ _ (ツ) _ / ¯   -  person Jay Blanchard    schedule 13.03.2017
comment
@Dimi В этом ответе также говорится об использовании консольных шрифтов Lucida, которые не используются в этом случае, поэтому это может быть то же самое решение.   -  person apokryfos    schedule 13.03.2017
comment
@JayBlanchard: пробовал переключиться на консоль Lucida - без разницы.   -  person u01jmg3    schedule 13.03.2017


Ответы (2)


<?
    echo "\u{221a}";
    echo json_decode('"\u221a"');
    echo html_entity_decode('&#x221a;', 0, 'UTF-8');
?>

Сеанс тестирования командной строки с использованием шрифта Consolas:

W:\php-7.1.2-Win32-VC14-x64>type test.php
<?
    echo "\u{221a}";
    echo json_decode('"\u221a"');
    echo html_entity_decode('&#x221a;', 0, 'UTF-8');
?>
W:\php-7.1.2-Win32-VC14-x64>chcp
Página de códigos activa: 850

W:\php-7.1.2-Win32-VC14-x64>php test.php
√√√
W:\php-7.1.2-Win32-VC14-x64>chcp 65001
Página de códigos activa: 65001

W:\php-7.1.2-Win32-VC14-x64>php test.php
√√√
W:\php-7.1.2-Win32-VC14-x64>

Отредактировано для адаптации к комментариям - протестировано на PHP 5.6.30.

<?
    $entity = '&radic;';

    // select the one you like the best
    $squareRoot = '√';
    $squareRoot = html_entity_decode($entity);
    $squareRoot = mb_convert_encoding($entity, 'UTF-8', 'HTML-ENTITIES');

    printf('test: %s', $squareRoot);

?>
person MC ND    schedule 13.03.2017
comment
Спасибо за это, но посмотрите мой отредактированный вопрос для вывода, который я получаю - я использую PHP 5.6. - person u01jmg3; 13.03.2017
comment
Добился большего успеха, но теперь у меня ?, с которым нужно бороться, и странности, когда мне нужны пробелы по обе стороны от %s, иначе я просто получаю ??? в качестве вывода. - person u01jmg3; 13.03.2017
comment
@ u01jmg3, не могу получить твою концовку ? (проверено с 5.6.19). Мне не удалось вывести на консоль символ Юникода без префикса. Любопытно, что если вы перенаправите вывод в файл, вы увидите правильный вывод. Если он вам нужен только для вывода на консоль, вы можете использовать printf(" \x08%s", $squareRoot); - person MC ND; 13.03.2017
comment
После долгого тестирования я наконец получил рабочий фрагмент кода, когда понял, какой интервал требуется для удаления несанкционированных символов. Заслуга принадлежит вам за то, что вы направили меня на правильный путь с printf() и html_entity_decode(). См. Мой ответ для окончательного решения. Думаю, переход на PHP 7 упростил бы задачу. - person u01jmg3; 14.03.2017

решение


<?php
    shell_exec('chcp 65001'); // set to utf-8
    $formatter = "\033[0m%s\n"; // use white text
    $sqrt      = html_entity_decode('&radic;');
    $output    = sprintf($formatter, $sqrt);
    $output   .= sprintf($formatter, $sqrt);
    // Padding required on the last line to prevent miscellaneous chars printing to the console
    // (Double the total number of lines (3))
    $output   .= sprintf($formatter, $sqrt . str_repeat(' ', 3*2));
    echo rtrim($output, "\n");
person u01jmg3    schedule 13.03.2017