PHP Conference Japan 2024

chr

(PHP 4、PHP 5、PHP 7、PHP 8)

chr從數字產生單一位元組字串

描述

chr(int $codepoint): string

傳回一個單一字元的字串,其中包含透過將 codepoint 解譯為無號整數所指定的字元。

這可以用於建立單一位元組編碼(例如 ASCII、ISO-8859 或 Windows 1252)中的單一字元字串,方法是傳遞所需字元在編碼對應表中的位置。但是,請注意此函式並未感知任何字串編碼,尤其不能傳遞 Unicode 碼點值來產生多位元組編碼(例如 UTF-8 或 UTF-16)中的字串。

此函式是 ord() 的補充。

參數

codepoint

介於 0 到 255 之間的整數。

超出有效範圍 (0..255) 的值將與 255 進行位元 AND 運算,這相當於以下演算法

while ($bytevalue < 0) {
$bytevalue += 256;
}
$bytevalue %= 256;

傳回值

包含指定位元組的單一字元字串。

變更日誌

版本 描述
7.4.0 此函式不再靜默接受不支援的 codepoint,並將其強制轉換為 0

範例

範例 #1 chr() 範例

<?php
// 假設字串將用作 ASCII 或相容 ASCII 的編碼

$str = "字串以跳脫字元結尾:";
$str .= chr(27); /* 在 $str 的結尾新增一個跳脫字元 */

/* 通常這更有用 */

$str = sprintf("字串以跳脫字元結尾:%c", 27);
?>

範例 #2 溢位行為

<?php
echo chr(-159), chr(833), PHP_EOL;
?>

以上範例將輸出

aA

範例 #3 從個別位元組建構 UTF-8 字串

<?php
$str
= chr(240) . chr(159) . chr(144) . chr(152);
echo
$str;
?>

以上範例將輸出


🐘

另請參閱

新增附註

使用者貢獻的附註 23 則附註

23
perrodin at laposte dot net
20 年前
請注意,如果數字大於 256,它將傳回數字 mod 256。
例如
chr(321)=A,因為 A=65(256)
16
voromax
15 年前
另一個快速且簡短的函式,可依其程式碼取得 Unicode 字元。

<?php
/**
* 依其程式碼傳回 Unicode 字元
*
* @param int $u
* @return char
*/
function unichr($u) {
return
mb_convert_encoding('&#' . intval($u) . ';', 'UTF-8', 'HTML-ENTITIES');
}
?>
8
grey - greywyvern - com
19 年前
我花了數小時尋找一個函式,該函式會接收數值 HTML 實體值並輸出適當的 UTF-8 位元組。我在另一個網站找到這個函式,只需要稍微修改一下;所以我沒有功勞。

<?php function unichr($dec) {
if (
$dec < 128) {
$utf = chr($dec);
} else if (
$dec < 2048) {
$utf = chr(192 + (($dec - ($dec % 64)) / 64));
$utf .= chr(128 + ($dec % 64));
} else {
$utf = chr(224 + (($dec - ($dec % 4096)) / 4096));
$utf .= chr(128 + ((($dec % 4096) - ($dec % 64)) / 64));
$utf .= chr(128 + ($dec % 64));
}
return
$utf;
}
?>

舉例來說:

<?php

$str
= "Chinese: &#20013;&#25991;";
$str = preg_replace("/&#(\d{2,5});/e", "unichr($1);", $str);

?>
5
mailderemi at gmail dot com
13 年前
以下是使用 "chr" 和 "ord" 進行編碼和解碼的範例。
<?php
function Encode($txtData,$Level){
for (
$j = 0;$j<$Level;$j++){
$tmpStr = '';
for (
$i = 0;$i<strlen($txtData);$i++)
$tmpStr .= ord(substr(strtoupper($txtData), $i, 1));
$txtData = $tmpStr;
}
return (
strlen($Level)).$Level.$txtData;
}

function
Decode($txtData){
$intLevel = substr($txtData, 1, substr($txtData, 0, 1));
$startStr = substr($txtData, substr($txtData, 0, 1)+1, strlen($txtData));
for (
$j = 0;$j<$intLevel;$j++){
for (
$i = 0;$i<strlen($startStr);$i+=2)
$tmpStr .= chr(intval(substr($startStr, $i, 2)));
$startStr = $tmpStr;

$tmpStr = "";
}
return
$startStr;
}

echo
Encode('123',4).'<br>';
echo
Decode(Encode('123',5));
?>
3
Noname
2 年前
<?php

for ($i = 128; $i <= 191; $i++) {
$str = chr(240) . chr(159) . chr(144) . chr($i);
echo
$str;
}

?>
2
synnus at gmail dot com
9 年前
// rivencodec 1.0
// 編碼反向 ASCII,一個簡單的函式可以編碼/解碼
// 可以用它來安全且快速地編碼文字

<?php

function rivencodec($ch,$a=0) {
while((@
$b = $ch[$a++])) { $ch[$a-1] = chr(255-ord($b)); }
return
$ch;
}


$zz = rivencodec("abcdefghijklmn");
echo
'encode: ',$zz,'<br/>',PHP_EOL;

$yy = rivencodec($zz);
echo
'decode: ',$yy,'<br/>',PHP_EOL;

?>
3
joeldegan AT yahoo.com
21 年前
想要在命令列 PHP 指令碼中使用終端機顏色嗎?

這個應該可以解決你的問題。
<?

$_colors = array(
'LIGHT_RED' => "[1;31m",
'LIGHT_GREEN' => "[1;32m",
'YELLOW' => "[1;33m",
'LIGHT_BLUE' => "[1;34m",
'MAGENTA' => "[1;35m",
'LIGHT_CYAN' => "[1;36m",
'WHITE' => "[1;37m",
'NORMAL' => "[0m",
'BLACK' => "[0;30m",
'RED' => "[0;31m",
'GREEN' => "[0;32m",
'BROWN' => "[0;33m",
'BLUE' => "[0;34m",
'CYAN' => "[0;36m",
'BOLD' => "[1m",
'UNDERSCORE' => "[4m",
'REVERSE' => "[7m",

);

function termcolored($text, $color="NORMAL", $back=1){
global $_colors;
$out = $_colors["$color"];
if($out == ""){ $out = "[0m"; }
if($back){
return chr(27)."$out$text".chr(27).chr(27)."[0m".chr(27);
}else{
echo chr(27)."$out$text".chr(27).chr(27)."[0m".chr(27);
}//fi
}// end function

echo termcolored("test\n", "BLUE");
?>
1
gjarrige at six-axe dot fr
12 年前
移除 ASCII 控制字元 (除了「換行」和「跳格」)

$tab_chr = array() ;
for($control = 0; $control < 32; $control++) {
if ($control != 9 && $control != 10) {
$tab_chr[]= chr($control) ;
}
}
$tab_chr[]= chr(127) ;
$string = str_replace($tab_chr, '', $string);
1
tenyou at gmail dot com
20 年前
當需要解析 IIS4 或 IIS5 的中繼資料庫傾印時,我寫了一個簡單的函式,將這些 MS 十六進位值轉換為它們的 ASCII 對應值。希望有人會覺得它有用。

<?php
function hex_decode($string) {
for (
$i=0; $i < strlen($string); $i) {
$decoded .= chr(hexdec(substr($string,$i,2)));
$i = (float)($i)+2;
}
return
$decoded;
}
?>
1
16 年前
除了如 sgaston 在 2006-02-13 所演示的,替換 Microsoft Windows 的智慧引號外,我還使用字元碼專家[2] Jukka Korpela 發表的建議[1],替換所有其他的 Microsoft Windows 字元。

<?php
$str
= str_replace(chr(130), ',', $str); // 基線單引號
$str = str_replace(chr(131), 'NLG', $str); // 弗羅林符號
$str = str_replace(chr(132), '"', $str); // 基線雙引號
$str = str_replace(chr(133), '...', $str); // 省略號
$str = str_replace(chr(134), '**', $str); // 劍號(第二個腳註)
$str = str_replace(chr(135), '***', $str); // 雙劍號(第三個腳註)
$str = str_replace(chr(136), '^', $str); // 抑揚符號
$str = str_replace(chr(137), 'o/oo', $str); // 千分比符號
$str = str_replace(chr(138), 'Sh', $str); // S Hacek
$str = str_replace(chr(139), '<', $str); // 左單引號角括號
$str = str_replace(chr(140), 'OE', $str); // OE 連字
$str = str_replace(chr(145), "'", $str); // 左單引號
$str = str_replace(chr(146), "'", $str); // 右單引號
$str = str_replace(chr(147), '"', $str); // 左雙引號
$str = str_replace(chr(148), '"', $str); // 右雙引號
$str = str_replace(chr(149), '-', $str); // 項目符號
$str = str_replace(chr(150), '-', $str); // 短破折號
$str = str_replace(chr(151), '--', $str); // 長破折號
$str = str_replace(chr(152), '~', $str); // 波浪符號
$str = str_replace(chr(153), '(TM)', $str); // 商標連字
$str = str_replace(chr(154), 'sh', $str); // s Hacek
$str = str_replace(chr(155), '>', $str); // 右單引號角括號
$str = str_replace(chr(156), 'oe', $str); // oe 連字
$str = str_replace(chr(159), 'Y', $str); // Y Dieresis
?>

[1] 關於在 HTML 中使用某些 MS Windows 字元
http://www.cs.tut.fi/~jkorpela/www/windows-chars.html

[2] Jukka Korpela 解說 Unicode
http://www.amazon.com/dp/059610121X/
1
16 年前
安全密碼產生器,符號的最大數量可變。

<?php

function passwdGen($minLength = 8, $maxLength = 12, $maxSymbols = 2)
{
$symbolCount = 0;

srand((double)microtime() * 1000003);

for (
$i = 0; $i < rand($minLength, $maxLength); $i++)
{
do
{
$char = rand(33, 126);

$symbolCount += $isSymbol = (!in_array($char, range(48, 57)) && !in_array($char, range(65, 90)) && !in_array($char, range(97, 122)));

if (
$symbolCount <= $maxSymbols || !$isSymbol)
{
break;
}
}
while (
true);

$passwd = sprintf('%s%c', isset($passwd) ? $passwd : NULL, $char);
}

return
$passwd;
}

?>
1
23 年前
這是一個函式,它可以幫助我更快地找出 chr(數字) 輸出的是什麼字元,而不用打出 256 個 echo 標籤。

<?php
function listChr(){
for (
$i = 0; $i < 256; ++$i) {
static
$genNum;
$genNum++;
echo
"chr($genNum) 將輸出 '";
echo (
chr($genNum));
echo
"'< br>\n";
}
}
listChr();
?>

另一個有用的 chr 是 #9,它代表一個 tab 鍵。在製作錯誤日誌時相當常用。

$tab = (chr(9));
echo "<pre>error{$tab}date{$tab}time</pre>";

-- HappyEvil
0
Ray.Paseur 有時使用 Gmail
5 年前
我需要產生一個無效的 UTF-8 字元來使用 JSON 進行測試。這個方法奏效了

<?php
echo '結尾的錯誤 UTF-8 字元' . chr(0xC6) ;
0
vitkorob
8 年前
另一個快速取得 Unicode 字元的函數,透過其編碼。

<?php

function unichr($dec)
{
if (
$dec < 0x80)
{
$utf = chr($dec);
}
else if (
$dec < 0x0800)
{
$utf = chr(0xC0 + ($dec >> 6));
$utf .= chr(0x80 + ($dec & 0x3f));
}
else if (
$dec < 0x010000)
{
$utf = chr(0xE0 + ($dec >> 12));
$utf .= chr(0x80 + (($dec >> 6) & 0x3f));
$utf .= chr(0x80 + ($dec & 0x3f));
}
else if (
$dec < 0x200000)
{
$utf = chr(0xF0 + ($dec >> 18));
$utf .= chr(0x80 + (($dec >> 12) & 0x3f));
$utf .= chr(0x80 + (($dec >> 6) & 0x3f));
$utf .= chr(0x80 + ($dec & 0x3f));
}
else
{
die(
"UTF-8 字元大小超過 4 個位元組");
}

return
$utf;
}

echo
unichr(0x263A);

?>
0
darek at module17 dot com
11 年前
使用 sprintf 和 %c 類型指定符的簡單密碼產生函數;它和 chr() 相同。

function genPass($len = 8) {
for ($i=0;$i<=$len;$i++) {
$passwd = sprintf('%s%c', isset($passwd) ? $passwd : NULL, rand(48, 122));
}
return $passwd;
}
0
ddawsonNOSPAM at execpc dot com
24 年前
[編輯註記

%c 定義為:「列印給定 ASCII 碼所屬的字元」

chr() 只會給出一個字串,所以你需要使用 %s,即使字串只包含一個字元。這和其他語言一致。
--Jeroen@php.net]


從我的錯誤中學習
不要期望這個能用!

<?php
$c_question
= chr(63);
$v_out = sprintf("<%cphp\n", $c_question);
//... 更多內容在此處被 sprintf'd 到 v_out ...
$v_out = sprintf("%s%c>\n", $v_out, $c_question);
$v_fp = fopen("foofile", "w");
if (
$v_fp)
{
fwrite($v_fp, $v_out, strlen($v_out));
fclose($v_fp);
}
?>

當我這樣做時,foofile 包含 <NUL NUL NUL NUL NUL>。
我花了很多時間查看 fputs、fwrite 來驗證我是否正確呼叫這些函數。
我的錯誤是使用 $c_question = chr(63) 而不是
$c_question = 63 (正確)。然後一切都正常了。
-1
Kristin
21 年前
請注意,chr(10) 是「換行符」,而 chr(13) 是「歸位符」,它們不一樣!當我嘗試解析表單和文字檔案中的文字以包含為 HTML 時發現了這一點,我將所有歸位符替換為 <BR>,但經過多次撓頭後才發現我應該尋找換行符。如果有人可以闡明兩者之間的差異,請務必說明。

如果你計劃將表單中的文字儲存到資料庫中以供稍後顯示,你需要應用以下函數,使其以適當的 HTML 標籤儲存。

<?php
$text
= str_replace ( chr(10), "<BR>", $text );
?>

當你想要將其重新插入該表單進行編輯時,你需要將其轉換回去。

<?php
$text
= str_replace ( "<BR>", chr(10), $text)
?>

希望這能為某些人省去一些麻煩。 :)
-1
v14t at gmx dot com
10 年前
參數會自動轉換為整數,因此 chr('65') 和 chr(65) 都會輸出字母 A
-2
ibaid at mail dot ru
6 年前
string mb_chr ( int $cp [, string $encoding ] )
參數列表
cp - 字元碼(以十進位表示)
encoding - 編碼(UTF-8、ASCII 等)

我們從 UTF-8 編碼中取得字母 'Ж'

$sim = mb_chr(0x0416, 'UTF-8');
echo $sim; // Ж

從 ASCII 編碼取得字元 '}'

$sim = mb_chr(125, 'ASCII');
echo $sim ; // }
-3
lingtalfi - at - somewhere
9 年前
看來 php 使用此處的表格:http://ascii-code.com/
(而不是此處:http://www.asciitable.com/,如文件中建議的那樣)適用於 128 到 255 的編碼。

<?php
for ($i = 32; $i <= 255; $i++) {
echo
chr($i);
}
?>
-4
darkodemon at gmail dot com
17 年前
具有 Unicode 支援的 chr()

<?php

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
uchr(23383); echo '<br/>';
echo
uchr(23383,215,23383); echo '<br/>';
echo
uchr(array(23383,215,23383,215,23383)); echo '<br/>';

?>
-2
gfour
5 年前
我一直在尋找一個簡單的方法來建構類似 Excel 的欄位識別符,例如:A B .... AA AB AC 等,使用 chr() 和 modulo,但這裡有魔術...
https://php.dev.org.tw/manual/en/language.operators.increment.php

所以,這個也行得通
<?php
$p
= chr(65); // 或直接 $p = 'A';
for ($i = 1; $i < 53; $i++){
echo
$p++ . " - ";
if (
$i % 10 == 0) echo '</br>';
}
?>

結果會是
A - B - C - D - E - F - G - H - I - J -
K - L - M - N - O - P - Q - R - S - T -
U - V - W - X - Y - Z - AA - AB - AC - AD -
AE - AF - AG - AH - AI - AJ - AK - AL - AM - AN -
AO - AP - AQ - AR - AS - AT - AU - AV - AW - AX -
AY - AZ -
-3
sinfocol at sinfocol dot org
15 年前
chr() 函式也接受負數作為 ascii 碼,因此 chr(-數字) 等於 chr((數字%256)+256)。
而對於大於 255 的 ascii 碼,則為 chr(數字%256)

我們可以用一個小腳本來測試
<?php
for($i=-300; $i<300; $i++){
echo
"Ascii $i\t" . ord(chr($i)) . "\n";
}
?>
To Top