PHP Conference Japan 2024

ord

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

ord將字串的第一個位元組轉換為 0 到 255 之間的值

說明

ord(字串 $character): 整數

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
"The first character of \$str is a line feed.\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;
}
?>

以上範例將輸出


$str 的第 0 個位元組值為 240
$str 的第 1 個位元組值為 159
$str 的第 2 個位元組值為 144
$str 的第 3 個位元組值為 152

另請參閱

新增註解

使用者貢獻的註解 6 則註解

47
arglanir+phpnet at gmail dot com
12 年前
由於 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
*/
?>
您可以根據您的需求修改我的程式碼。
7
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;
}
18
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」是一個模稜兩可且具有誤導性的名稱。
8
v0rbiz at yahoo dot com
20 年前
我沒有找到一個支援 unicode/多位元組的 'ord' 函式,所以...

<?php
函式 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;
}
?>
-1
無名氏
2 年前
<?php

宣告 (編碼='UTF-8');

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

$animals = mb_str_split($animalsstr);
foreach (
$animals 作為 $animal) {
for (
$pos = 0; $pos < strlen($animal); $pos++) {
$byte = substr($animal, $pos);
echo
"位元組 $pos$animal 值為 " . ord($byte) . PHP_EOL;
}
}

?>
-3
匿名
3 年前
對於任何想要將完整字串轉換為映射並轉換回來的人來說,這很簡單,但需要一些時間來適應...下面的程式碼為像我這樣的初學者節省了一個小時的搜尋程式碼時間。

函式 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;
}

函式 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