代码之家  ›  专栏  ›  技术社区  ›  MidnightLightning

PHP构造Unicode字符串?

  •  7
  • MidnightLightning  · 技术社区  · 14 年前

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

    <?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会话到服务器)是:

    Section sign: ?
    Section sign: ?
    Section sign: ?
    Section sign: §
    

    所以,这证明了我使用的终端字体中有分节符,SSH连接成功地发送了它,但是 从代码号构造它时没有正确地构造它。

    如果我只有代码号而没有复制/粘贴选项,我有什么选项?

    5 回复  |  直到 14 年前
        1
  •  4
  •   Michael Madsen    14 年前

    当排除mb_2;函数和iconv时,PHP对Unicode一无所知。你必须自己对这个角色进行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);
    }
    
        2
  •  5
  •   bobince    14 年前

    iconv ,这里有一个简单的方法不涉及自己实现UTF-8:

    function unichr($i) {
        return iconv('UCS-4LE', 'UTF-8', pack('V', $i));
    }
    
        3
  •  3
  •   Pekka    14 年前

    别忘了UTF-8是一种可变长度编码。

    § § 是UTF-8中的多字节字符,前面有 c2 表示 first byte of a two-byte sequence. . 这应该起作用:

    echo "Section sign: ".chr(0xC2).chr(0xA7)."\n"; 
    
        4
  •  3
  •   The Surrican    14 年前
    chr
    
    (PHP 4, PHP 5)
    
    chr — Return a specific character
    
    Report a bug
     Description
    
    string chr ( int $ascii )
    Returns a one-character string containing the character specified by ascii.
    

    重要的是单词ascii:) 试试这个:

      function uchr ($codes) {
            if (is_scalar($codes)) $codes= func_get_args();
            $str= '';
            foreach ($codes as $code) $str.= html_entity_decode('&#'.$code.';',ENT_NOQUOTES,'UTF-8');
            return $str;
        }
        echo "Section sign: ".uchr(167)."\n"; // Using CHR function
        echo "Section sign: ".uchr(0xA7)."\n";
    
        5
  •  0
  •   Bernard Rosset    10 年前

    最初提出这个问题的人可能对最好地重构他/她的代码感兴趣。

    手动将ascii重新编程为unicode就像重新发明轮子,而不是谈论错误/性能潜力。

    1. pack 要从输入数据中创建值,通常使用适当的代码来读取正确数量的数据 pack("H*", <input data>)
    2. mb_convert_encoding 要将ASCII字符串转换为unicode字符串,请使用 mb_convert_encoding(<ASCII string>, "UTF-8") . 如果无法正确识别输入字符串,则此函数的第三个参数允许指定输入编码