ord

(PHP 4, PHP 5, PHP 7, PHP 8)

ord文字列の先頭バイトを、0 から 255 までの値に変換する

説明

ord(string $character): int

character の先頭バイトのバイナリ値を、 0 から 255 までの符号なしの整数値として解釈します。

string が ASCII, ISO-8859, Windows 1252 のような シングルバイトエンコーディング だった場合、 これは文字セットのマッピングテーブルにある文字の位置を返すことと同義です。 しかし、この関数は string のエンコーディングについて知りませんし、 特に UTF-8 や UTF-16 のようなマルチバイトエンコーディングについては、 この関数からは Unicode のコードポイントは絶対にわからないことに注意してください。

この関数は chr() と逆の動作をします。

パラメータ

character

文字列。

戻り値

0 から 255 までの整数値を返します。

例1 ord() の例

<?php
$str
= "\n";
if (
ord($str) == 10) {
echo
"\$str の先頭は改行文字です。\n";
}
?>

例2 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

参考

add a note add a note

User Contributed Notes 6 notes

up
46
arglanir+phpnet at gmail dot com
12 years ago
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.
up
5
paco at olecode dot com
4 years ago
this function convert UTF-8 string to RTF code string. I am using code of v0rbiz at yahoo dot com, thanks!!!

function cadena_rtf($txt)
   {
      $result = null;

      for ($pos = 0; $pos < mb_strlen($txt); $pos++) {

         $char = mb_substr($txt, $pos, 1);

         if (!preg_match("/[A-Za-z1-9,.]/", $char)) {
            //unicode ord real!!!
            $k   = mb_convert_encoding($char, 'UCS-2LE', 'UTF-8');
            $k1  = ord(substr($k, 0, 1));
            $k2  = ord(substr($k, 1, 1));
            $ord = $k2 * 256 + $k1;

            if ($ord > 255) {
               $result .= '\uc1\u' . $ord . '*';
            } elseif ($ord > 32768) {
               $result .= '\uc1\u' . ($ord - 65535) . '*';
            } else {
               $result .= "\\'" . dechex($ord);
            }
         } else {
            $result .= $char;
         }
      }
      return $result;
   }
up
17
rowan dot collins at cwtdigital dot com
11 years ago
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.
up
10
v0rbiz at yahoo dot com
20 years ago
I did not found a unicode/multibyte capable 'ord' function, so...

<?php
function uniord($u) {
   
$k = mb_convert_encoding($u, 'UCS-2LE', 'UTF-8');
   
$k1 = ord(substr($k, 0, 1));
   
$k2 = ord(substr($k, 1, 1));
    return
$k2 * 256 + $k1;
}
?>
up
1
Noname
2 years ago
<?php

declare (encoding='UTF-8');

$animalsstr = '🐀🐁🐂🐃🐄🐅🐆🐇🐈🐉🐊🐋🐌🐍🐎🐏🐐🐑🐒🐓🐔🐕🐖🐗🐘🐙'
       
. '🐚🐛🐜🐝🐞🐟🐠🐡🐢🐣🐤🐥🐦🐧🐨🐩🐪🐫🐬🐭🐮🐯🐰🐱🐲🐳🐴🐵'
       
. '🐶🐷🐸🐹🐺🐻🐼🐽🐾🐿';

$animals = mb_str_split($animalsstr);
foreach (
$animals as $animal) {
    for (
$pos = 0; $pos < strlen($animal); $pos++) {
       
$byte = substr($animal, $pos);
        echo
"Byte $pos of $animal has value " . ord($byte) . PHP_EOL;
    }
}

?>
up
-4
Anonymous
3 years ago
For anyone who's looking to convert full strings to map and back it's pretty simple but takes some getting used to...the code below saves an hour of scrounging codes for beginners like myself.

function var2map($a) {
    $b='';
    $c=strlen($a);
    for($i=0; $i<$c; ++$i) {
        $d=ord(substr($a,$i,1));
        if($d<10) {
            $e='00'.$d;
        } else {
            if($d<100) {
                $e='0'.$d;
            } else {
                $e=$d;
            }
        }
        if($b=='') {
            $b=$e;
        } else {
            $b=$b.$e;
        }
    }
    return $b;
}

function map2var($a) {
    $b='';
    $c=strlen($a) / 3;
    for($i=0; $i<$c; ++$i) {
        $d=chr(substr($a,$i*3,3));
        if($b=='') {
            $b=$d;
        } else {
            $b=$b.$d;
        }
    }
    return $b;
}
To Top