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>&#x{$code};</pre> </td>
<td>&#x{$code};</td>
</tr>" ;
}
}
echo '</table>';
HTML char
-----------------
...
╒ ╒
╓ ╓
╔ ╔
╕ ╕
╖ ╖
╗ ╗
...
所以我假设你想得到这样的东西(运行 片段):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test</title>
<style>
.monospace {
font-family: monospace;
}
</style>
</head>
<body>
<div class="monospace">
╔═══════════╗<br>
║ Some text ║<br>
╚═══════════╝
</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
。
我已经从 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>&#x{$code};</pre> </td>
<td>&#x{$code};</td>
</tr>" ;
}
}
echo '</table>';
HTML char
-----------------
...
╒ ╒
╓ ╓
╔ ╔
╕ ╕
╖ ╖
╗ ╗
...
所以我假设你想得到这样的东西(运行 片段):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>test</title>
<style>
.monospace {
font-family: monospace;
}
</style>
</head>
<body>
<div class="monospace">
╔═══════════╗<br>
║ Some text ║<br>
╚═══════════╝
</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
。