chr 不显示来自 CLI 请求的 ascii 扩展符号

chr not show ascii extended symbol from CLI request

我已经从 cli 和 php 脚本中调用了这样的脚本:

# php test.php

php脚本内容:

<?php
echo chr(201);

这是 CLI 左上角的方角

但它显示 É 个字符并且预期:
对不起,我没有为 post 找到这个字符)。

我已经尝试使用其他方法让它工作,但没有任何效果:

<?php
echo mb_convert_encoding(chr(201), 'UTF-8', 'ISO-8859-1');
<?php
echo utf8_encode(chr(201));

PHP 文件是没有 BOM 的 UTF-8。

终端设置:

更新:文本输出:

<0x1b[1;0m
array [
    'idprocess' => string(11): 'c-cron-0001',
    'idform' => string(11): 'c-cron-0001',
]
<0x1b>[0m
<0x1b>[1;0m
array [
    'idprocess' => string(11): 'c-cron-0004',
    'idform' => string(11): 'c-cron-0004',
]
<0x1b>[0m
<0x1b>[1;0m
array [
    'idprocess' => string(11): 'c-cron-0005',
    'idform' => string(11): 'c-cron-0005',
]
<0x1b>[0m
<0x1b>[1;0m
array [
    'idprocess' => string(11): 'c-cron-0006',
    'idform' => string(11): 'c-cron-0006',
]
<0x1b>[0m
<0x1b>[1;0m
array [
    'idprocess' => string(11): 'c-cron-0007',
    'idform' => string(11): 'c-cron-0007',
]
<0x1b>[0m

更新:drawbox 函数的输出:

╔══════════════════════════════════════════════════════════════════════════════╗
║ <0x1b>[1;0m                                                                       ║
║ array [                                                                      ║
║     'idprocess' => string(11): 'c-cron-0001',                                ║
║     'idform' => string(11): 'c-cron-0001',                                   ║
║ ]                                                                            ║
║ <0x1b>[0m                                                                         ║
║ <0x1b>[1;0m                                                                       ║
║ array [                                                                      ║
║     'idprocess' => string(11): 'c-cron-0004',                                ║
║     'idform' => string(11): 'c-cron-0004',                                   ║
║ ]                                                                            ║
║ [0m                                                                         ║
║ [1;0m                                                                       ║
║ array [                                                                      ║
║     'idprocess' => string(11): 'c-cron-0005',                                ║
║     'idform' => string(11): 'c-cron-0005',                                   ║
║ ]                                                                            ║
║ <0x1b>[0m                                                                         ║
║ <0x1b>[1;0m                                                                       ║
║ array [                                                                      ║
║     'idprocess' => string(11): 'c-cron-0006',                                ║
║     'idform' => string(11): 'c-cron-0006',                                   ║
║ ]                                                                            ║
║ <0x1b>[0m                                                                         ║
║ <0x1b>[1;0m                                                                       ║
║ array [                                                                      ║
║     'idprocess' => string(11): 'c-cron-0007',                                ║
║     'idform' => string(11): 'c-cron-0007',                                   ║
║ ]                                                                            ║
║ <0x1b>[0m                                                                         ║
║                                                                              ║
╚══════════════════════════════════════════════════════════════════════════════╝

在 PHP 中使用 cp1252 的扩展 ASCII 中 chr(201)É

执行这段代码:

<?php
for ($i = 0; $i <= 255; $i++) {
    echo "$i: " . htmlentities(chr($i), ENT_QUOTES, 'cp1252') . "<br />";
}

您实际要查找的是 Box Drawing characters,它在 Unicode 中具有其他值。您可以从维基百科复制并粘贴它,或者 运行 这个脚本来显示所有带有数字实体的字符:

<?php
$mains = [250, 251, 252, 253, 254, 255, 256, 257];
$subs = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'A', 'B', 'C', 'D', 'E', 'F'];
echo '<table>';
foreach ($mains as $main){
    foreach ($subs as $sub){
        $code = $main.$sub;
        echo "
            <tr>
                <td><pre>&amp;#x{$code};</pre> </td>
                <td>&#x{$code};</td>
            </tr>" ;
    }
}
echo '</table>';
HTML        char
-----------------
...
&#x2552;    ╒
&#x2553;    ╓
&#x2554;    ╔
&#x2555;    ╕
&#x2556;    ╖
&#x2557;    ╗
...

所以我假设你想得到这样的东西(运行 片段):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>test</title>
    <style>
        .monospace {
            font-family: monospace;
        }
    </style>
</head>
<body>
<div class="monospace">
    &#x2554;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2557;<br>
    &#x2551; Some text &#x2551;<br>
    &#x255A;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x2550;&#x255D;
</div>

</body>
</html>

我很确定你会花很长时间来画这些盒子,我建议一些 PP 脚本来计算内部文本的长度 LOL :D

更新

实际上根据 this old article 图纸甚至很有趣 :D

<?php

drawBoxes(
    [
        'Header',
        'Hello, World!',
        'Box drawing is alive after all these years!!!! :D',
        'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum arcu.'
    ],
    true,
    true
);

function drawBoxes(array $lines, $isFirstLineHeader = false, $wrapInPre = false)
{
    $tl = html_entity_decode('╔', ENT_NOQUOTES, 'UTF-8'); // top left corner
    $tr = html_entity_decode('╗', ENT_NOQUOTES, 'UTF-8'); // top right corner
    $bl = html_entity_decode('╚', ENT_NOQUOTES, 'UTF-8'); // bottom left corner
    $br = html_entity_decode('╝', ENT_NOQUOTES, 'UTF-8'); // bottom right corner
    $v = html_entity_decode('║', ENT_NOQUOTES, 'UTF-8');  // vertical wall
    $h = html_entity_decode('═', ENT_NOQUOTES, 'UTF-8');  // horizontal wall

    $hs = html_entity_decode('─', ENT_NOQUOTES, 'UTF-8');  // horizontal wall single
    $ls = html_entity_decode('╟', ENT_NOQUOTES, 'UTF-8');  // right separator
    $rs = html_entity_decode('╢', ENT_NOQUOTES, 'UTF-8');  // right separator

    $longest = 0;
    foreach ($lines as $line) {
        $len = strlen($line);
        if ($len > $longest) {
            $longest = $len;
        }
    }
    $preStart = $wrapInPre ? "<pre style='font-family: monospace'>" . PHP_EOL : '';
    $preEnd = $wrapInPre ? PHP_EOL . "</pre>" : '';
    echo $preStart . $tl . str_repeat($h, $longest + 2) . $tr . PHP_EOL;
    $i = 0;
    foreach ($lines as $line) {
        $addEmpty = '';
        $len = strlen($line);
        if ($len < $longest) {
            $addEmpty = str_repeat(' ', $longest - $len);
        }
        echo $v . ' ' . $line . $addEmpty . ' ' . $v;
        if ($isFirstLineHeader && $i == 0) {
            echo PHP_EOL . $ls . str_repeat($hs, $longest + 2) . $rs . PHP_EOL;
        } else {
            echo PHP_EOL;
        }
        $i++;
    }

    echo $bl . str_repeat($h, $longest + 2) . $br . $preEnd;
}

输出

╔═══════════════════════════════════════════════════════════════════════════╗
║ Header                                                                    ║
╟───────────────────────────────────────────────────────────────────────────╢
║ Hello, World!                                                             ║
║ Box drawing is alive after all these years!!!! :D                         ║
║ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum arcu. ║
╚═══════════════════════════════════════════════════════════════════════════╝

如果要在 HTML 中显示,请将 drawBoxes() 函数 $wrapInPre 的第二个参数设置为 true,如果是纯文本,请设置 false