ord

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

ord将字符串的第一个字节转换为 0 到 255 之间的数值

描述

ord(string $character): int

character 的第一个字节的二进制值解释为 0 到 255 之间的无符号整数。

如果字符串使用单字节编码,例如 ASCII、ISO-8859 或 Windows 1252,则这等效于返回字符在字符集映射表中的位置。但是,请注意,此函数不了解任何字符串编码,特别是永远不会在多字节编码(例如 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

参见

添加注释

用户贡献的注释 6 个注释

arglanir+phpnet at gmail dot com
11 年前
由于 ord() 不适用于 utf-8,如果您无法使用 mb_* 函数,以下函数将非常有用
<?php
function ordutf8($string, &$offset) {
$code = ord(substr($string, $offset,1));
if (
$code >= 128) { //否则 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 是一个引用,因为它不容易逐字符拆分 utf-8 字符。对于迭代字符串很有用
<?php
$text
= "abcàê߀abc";
$offset = 0;
while (
$offset >= 0) {
echo
$offset.": ".ordutf8($text, $offset)."\n";
}
/* 返回:
0: 97
1: 98
2: 99
3: 224
5: 234
7: 223
9: 8364
12: 97
13: 98
14: 99
*/
?>
欢迎根据您的需求调整我的代码。
paco at olecode dot com
4 年前
此函数将 UTF-8 字符串转换为 RTF 代码字符串。我正在使用 v0rbiz at yahoo dot com 的代码,感谢!

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 真实值!
$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;
}
rowan dot collins at cwtdigital dot com
11 年前
关于字符集,以及这是否是“ASCII”。首先,没有“8 位 ASCII”这种东西,所以如果它是 ASCII,它只会返回小于 127 的整数。8 位 ASCII 兼容编码包括 ISO 8859 编码系列,它们将各种常见字符映射到 128 到 255 之间的数值。UTF-8 的设计也是这样,以使 7 位 ASCII 中可表示的字符具有相同的编码;UTF-8 字符串中大于 127 的字节值表示多字节字符的开头。

事实上,像 PHP 中大多数字符串函数一样,此函数根本没有执行任何与字符编码相关的事情 - 它只是将字符串中的一个二进制字节解释为无符号整数。也就是说,ord(chr(200)) 将始终返回 200,但 chr(200) *表示* 的字符将根据它作为 *解释* 的字符编码而有所不同(例如,在显示期间)。

技术上正确的描述应该是“返回字符串首字节的整数表示,范围为 0 到 255。对于单字节编码(如(7 位)ASCII 和 ISO 8859 系列),这将对应于第一个字符,并且是该字符在编码映射表中的位置。对于多字节编码,例如 UTF-8 或 UTF-16,该字节可能不代表完整的字符。”

指向 asciitable.com 的链接也应替换为一个解释它正在显示的字符编码的链接,因为“扩展 ASCII”是一个模棱两可且具有误导性的名称。
v0rbiz at yahoo dot com
20 年前
我没有找到支持 Unicode/多字节的 'ord' 函数,所以...

<?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;
}
?>
Noname
2 年前
<?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;
}
}

?>
Anonymous
3 年前
对于任何想要将完整的字符串转换为映射并转换回来的人来说,这很简单,但需要一些时间来适应...下面的代码可以为像我这样的初学者节省一个小时的代码搜索。

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