• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • ord()

    (PHP 4, PHP 5, PHP 7)

    转换字符串第一个字节为 0-255 之间的值

    说明

    ord (string $string ) : int

    解析 $string 二进制值第一个字节为 0 到 255 范围的无符号整型类型。

    如果字符串是 ASCII、 ISO-8859、Windows 1252之类单字节编码,就等于返回该字符在字符集编码表中的位置。 但请注意,本函数不会去检测字符串的编码,尤其是不会识别类似 UTF-8 或 UTF-16 这种多字节字符的 Unicode 代码点(code point)。

    该函数是 chr() 的互补函数。

    参数


    $string

    一个字符。

    返回值

    返回 0 - 255 的整型值。

    范例


    ord() 范例

     <?php
    $str = "\n";
    if (ord($str) == 10) {
        echo "The first character of \$str is a line feed.\n";
    }
    ?>  


    检查 UTF-8 字符串的每一个字节

     <?php
    declare(encoding='UTF-8');
    $str = "";
    for ( $pos=0; $pos < strlen($str); $pos ++ ) {
     $byte = substr($str, $pos);
     echo 'Byte ' . $pos . ' of $str has value ' . ord($byte) . PHP_EOL;
    }
    ?>  

    以上例程会输出:


    Byte 0 of $str has value 240
    Byte 1 of $str has value 159
    Byte 2 of $str has value 144
    Byte 3 of $str has value 152

    参见


    • chr()返回指定的字符
    • » ASCII 码表


     As ord() doesn't work with utf-8, and if you do not have access to mb_* functions, the following function will work well:
    <?php
    function ordutf8($string, &$offset) {
      $code = ord(substr($string, $offset,1)); 
      if ($code >= 128) {    //otherwise 0xxxxxxx
        if ($code < 224) $bytesnumber = 2;        //110xxxxx
        else if ($code < 240) $bytesnumber = 3;    //1110xxxx
        else if ($code < 248) $bytesnumber = 4;  //11110xxx
        $codetemp = $code - 192 - ($bytesnumber > 2 ? 32 : 0) - ($bytesnumber > 3 ? 16 : 0);
        for ($i = 2; $i <= $bytesnumber; $i++) {
          $offset ++;
          $code2 = ord(substr($string, $offset, 1)) - 128;    //10xxxxxx
          $codetemp = $codetemp*64 + $code2;
        }
        $code = $codetemp;
      }
      $offset += 1;
      if ($offset >= strlen($string)) $offset = -1;
      return $code;
    }
    ?>
    $offset is a reference, as it is not easy to split a utf-8 char-by-char. Useful to iterate on a string:
    <?php
    $text = "abcàê߀abc";
    $offset = 0;
    while ($offset >= 0) {
      echo $offset.": ".ordutf8($text, $offset)."\n";
    }
    /* returns:
    0: 97
    1: 98
    2: 99
    3: 224
    5: 234
    7: 223
    9: 8364
    12: 97
    13: 98
    14: 99
    */
    ?>
    Feel free to adapt my code to fit your needs. 
     Regarding character sets, and whether or not this is "ASCII". Firstly, there is no such thing as "8-bit ASCII", so if it were ASCII it would only ever return integers up to 127. 8-bit ASCII-compatible encodings include the ISO 8859 family of encodings, which map various common characters to the values from 128 to 255. UTF-8 is also designed so that characters representable in 7-bit ASCII are coded the same; byte values higher than 127 in a UTF-8 string represent the beginning of a multi-byte character.
    In fact, like most of PHP's string functions, this function isn't doing anything to do with character encoding at all - it is just interpreting a binary byte from a string as an unsigned integer. That is, ord(chr(200)) will always return 200, but what character chr(200) *means* will vary depending on what character encoding it is *interpreted* as part of (e.g. during display).
    A technically correct description would be "Returns an integer representation of the first byte of a string, from 0 to 255. For single-byte encodings such as (7-bit) ASCII and the ISO 8859 family, this will correspond to the first character, and will be the position of that character in the encoding's mapping table. For multi-byte encodings, such as UTF-8 or UTF-16, the byte may not represent a complete character."
    The link to asciitable.com should also be replaced by one which explains what character encoding it is displaying, as "Extended ASCII" is an ambiguous and misleading name. 

    上篇:number_format()

    下篇:parse_str()