1

For a PHP (5.6) script that is run in the command line I am attempting to print the square root symbol but am failing to do so. Instead I get junk characters.

I have already read the many questions/answers on printing unicode characters from PHP CLI to the command line but none relate exactly to my example.

I am on Windows 10 using the standard command prompt (cmd.exe) which I am happy using.

I am using the Consolas font and have run chcp 65001 to set the prompt to utf-8. *Have also tried Lucida console*.

// Square root symbol

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

I have tried iconv(), json_decode(), mb_convert_encoding() and pack() all unsuccessfully.

u01jmg3
  • 712
  • 1
  • 11
  • 31

2 Answers2

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

Command line test session with "Consolas" font:

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>

Edited to adapt to comments - Tested on 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);

?>
MC ND
  • 69,615
  • 8
  • 84
  • 126
  • Thanks for this but see my edited question for the output I get - I am on PHP 5.6 – u01jmg3 Mar 13 '17 at 15:33
  • Having more success but now I have `?` to contend with and weirdness where I need spaces either side of the `%s` otherwise I just get `???` as output. – u01jmg3 Mar 13 '17 at 18:14
  • @u01jmg3, I can not get your ending `?` (tested with 5.6.19). I've been no able to output to console the unicode character without a prefix. Curiously if you redirect the output to a file you will see a correct output. If you only need it for console output, you can use `printf(" \x08%s", $squareRoot);` – MC ND Mar 13 '17 at 19:30
  • After much testing I finally got a working piece of code once I understood the spacing that was required to remove rogue characters. Credit goes to you though for putting me on the right track with `printf()` and `html_entity_decode()`. See my answer for the final solution. Think moving to PHP 7 would have made things simpler. – u01jmg3 Mar 13 '17 at 22:20
0

solution


<?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");
u01jmg3
  • 712
  • 1
  • 11
  • 31