给定要从CLI PHP脚本输出的字符的Unicode十进制或十六进制数字,PHP如何生成它? chr()函数似乎无法生成正确的输出。这是我的测试脚本,使用分节符U + 00A7(十六进制的A7,十进制的167,在UTF-8中应表示为C2 A7)作为测试:

<?php
echo "Section sign: ".chr(167)."\n"; // Using CHR function
echo "Section sign: ".chr(0xA7)."\n";
echo "Section sign: ".pack("c", 0xA7)."\n"; // Using pack function?
echo "Section sign: §\n"; // Copy and paste of the symbol into source code

我得到的输出(通过到服务器的SSH session )是:
Section sign: ?
Section sign: ?
Section sign: ?
Section sign: §

因此,这证明我正在使用的终端字体中包含“分节符”字符,并且SSH连接已成功发送了该字体,但是从代码编号构造chr()时,并不能正确地构造它。

如果我只有密码而不是复制/粘贴选项,那么我有哪些选项?

最佳答案

当排除mb_函数和iconv时,PHP不了解Unicode。您必须自己对UTF-8编码字符。

为此,维基百科上有一个关于如何构造UTF-8的excellent overview。这是基于该文章的快速,肮脏且未经测试的功能:

function codepointToUtf8($codepoint)
{
    if ($codepoint < 0x7F) // U+0000-U+007F - 1 byte
        return chr($codepoint);
    if ($codepoint < 0x7FF) // U+0080-U+07FF - 2 bytes
        return chr(0xC0 | ($codepoint >> 6)).chr(0x80 | ($codepoint & 0x3F);
    if ($codepoint < 0xFFFF) // U+0800-U+FFFF - 3 bytes
        return chr(0xE0 | ($codepoint >> 12)).chr(0x80 | (($codepoint >> 6) & 0x3F).chr(0x80 | ($codepoint & 0x3F);
    else // U+010000-U+10FFFF - 4 bytes
        return chr(0xF0 | ($codepoint >> 18)).chr(0x80 | ($codepoint >> 12) & 0x3F).chr(0x80 | (($codepoint >> 6) & 0x3F).chr(0x80 | ($codepoint & 0x3F);
}

09-13 02:32
查看更多