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 进行按位与运算,这等效于以下算法

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

返回值

包含指定字节的单字符字符串。

变更日志

版本 描述
7.4.0 该函数不再静默接受不支持的 codepoint,并将这些代码点强制转换为 0

示例

示例 #1 chr() 示例

<?php
// 假设字符串将用作 ASCII 或与 ASCII 兼容的编码

$str = "The string ends in escape: ";
$str .= chr(27); /* 在 $str 的末尾添加一个转义字符 */

/* 通常这更有用 */

$str = sprintf("The string ends in escape: %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;
?>

以上示例将输出


🐘

参见

  • sprintf() - 返回格式化的字符串,其格式字符串为 %c
  • ord() - 将字符串的第一个字节转换为 0 到 255 之间的数值
  • 一个 » ASCII 表
  • mb_chr() - 通过 Unicode 代码点值返回字符
  • IntlChar::chr() - 通过代码点值返回 Unicode 字符

添加注释

用户贡献的注释 23 个注释

21
perrodin at laposte dot net
20 年前
请注意,如果数字大于 256,它将返回数字模 256。
例如
chr(321)=A 因为 A=65(256)
14
voromax
15 年前
另一个快速简短的函数,用于通过其代码获取 Unicode 字符。

<?php
/**
* 通过其代码返回 Unicode 字符
*
* @param int $u
* @return char
*/
function unichr($u) {
return
mb_convert_encoding('&#' . intval($u) . ';', 'UTF-8', 'HTML-ENTITIES');
}
?>
7
grey - greywyvern - com
18 年前
我花了几个小时寻找一个函数,该函数可以接受数值 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);

?>
3
Noname
2 年前
<?php

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

?>
3
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));
?>
1
synnus at gmail dot com
8 年前
// 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;

?>
2
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
happyevil(at)1218.org
23 年前
这里有一个函数,它可以帮助我更快地找出 chr(数字) 输出哪个字符,而不是打出 256 个 echo 标签。

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

另一个有用的 chr 是 #9,它是一个制表符。在创建错误日志时非常有用。

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

-- HappyEvil
0
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);
0
scott at quinlan dot co dot nz
15 年前
带有可变最大符号数量的安全密码生成器。

<?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;
}

?>
0
Josh B.
16 年前
除了替换 Microsoft Windows 智能引号(正如 sgaston 在 2006-02-13 中演示的那样),我还使用字符代码专家[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 捷克语变音符
$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 捷克语变音符
$str = str_replace(chr(155), '>', $str); // 右单引号
$str = str_replace(chr(156), 'oe', $str); // oe 连字
$str = str_replace(chr(159), 'Y', $str); // Y 分音符
?>

[1] 关于在 HTML 中使用一些 MS Windows 字符
http://www.cs.tut.fi/~jkorpela/www/windows-chars.html

[2] Jukka Korpela 解释 Unicode
http://www.amazon.com/dp/059610121X/
0
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
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;
}
-1
Ray.Paseur sometimes uses Gmail
5 年前
我需要为 JSON 测试生成一个无效的 UTF-8 字符。这个方法奏效了

<?php
echo 'Bogus UTF-8 character at end' . chr(0xC6) ;
-1
ddawsonNOSPAM at execpc dot com
24 年前
[编辑注

%c 被定义为:“打印属于给定 ASCII 代码的字符”

chr() 只是提供一个字符串,所以你需要使用 %s,即使字符串只包含一个字符。这与其他语言是一致的。
[email protected]]


从我的错误中学习
不要指望这个能奏效!

<?php
$c_question
= chr(63);
$v_out = sprintf("<%cphp\n", $c_question);
//... more stuff being sprintf'd into v_out here ...
$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(正确)。然后一切正常。
-2
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)
?>

希望这可以帮助大家节省一些时间。:)
-2
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 character size is more than 4 bytes");
}

return
$utf;
}

echo
unichr(0x263A);

?>
-2
v14t at gmx dot com
10 年前
参数会自动转换为整数,因此 chr('65') 和 chr(65) 都会输出字母 A
-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/>';

?>
-4
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);
}
?>
-3
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 ; // }
-4
sinfocol at sinfocol dot org
15 年前
函数 chr() 也接受负数作为 ASCII 代码,因此 chr(-number) 等于 chr((number%256)+256)。
对于高于 255 的 ASCII 代码,它是 chr(number%256)

我们可以用一个小脚本测试
<?php
for($i=-300; $i<300; $i++){
echo
"Ascii $i\t" . ord(chr($i)) . "\n";
}
?>
-3
gfour
5 年前
我一直在寻找一种简单的方法来构建类似 Excel 的列标识符,例如:A B .... AA AB AC 等,使用 chr() 和模运算,但有魔法...
https://php.net/manual/en/language.operators.increment.php

所以,这也行
<?php
$p
= chr(65); // or simply $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 -
To Top