请注意,如果数字大于 256,它将返回数字模 256。
例如
chr(321)=A 因为 A=65(256)
(PHP 4, PHP 5, PHP 7, PHP 8)
chr — 从数字生成单字节字符串
返回一个包含由 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;
?>
以上示例将输出
%c
另一个快速简短的函数,用于通过其代码获取 Unicode 字符。
<?php
/**
* 通过其代码返回 Unicode 字符
*
* @param int $u
* @return char
*/
function unichr($u) {
return mb_convert_encoding('&#' . intval($u) . ';', 'UTF-8', 'HTML-ENTITIES');
}
?>
我花了几个小时寻找一个函数,该函数可以接受数值 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: 中文";
$str = preg_replace("/&#(\d{2,5});/e", "unichr($1);", $str);
?>
<?php
for ($i = 128; $i <= 191; $i++) {
$str = chr(240) . chr(159) . chr(144) . chr($i);
echo $str;
}
?>
这是一个使用 "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));
?>
// 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;
?>
想要在命令行 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");
?>
这里有一个函数,它可以帮助我更快地找出 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
删除 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);
带有可变最大符号数量的安全密码生成器。
<?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;
}
?>
除了替换 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/
在处理解析 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;
}
?>
使用 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;
}
我需要为 JSON 测试生成一个无效的 UTF-8 字符。这个方法奏效了
<?php
echo 'Bogus UTF-8 character at end' . chr(0xC6) ;
[编辑注
%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(正确)。然后一切正常。
请注意,chr(10) 是“换行符”,chr(13) 是“回车符”,它们并不相同!我在尝试解析来自表单和文本文件的文本以包含为 HTML 时发现了这一点,我用 <BR> 替换了所有回车符,结果发现经过多次挠头之后,我应该寻找换行符。如果有人能解释一下两者之间的区别,请告诉我。
如果您计划将表单中的文本保存到数据库中以供日后显示,则需要应用以下函数,以便它与正确的 HTML 标记一起保存。
<?php
$text = str_replace ( chr(10), "<BR>", $text );
?>
当您要将其重新插入表单以供编辑时,您需要将其转换回原始格式。
<?php
$text = str_replace ( "<BR>", chr(10), $text)
?>
希望这可以帮助大家节省一些时间。:)
另一个快速函数,用于根据其代码获取 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);
?>
支持 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/>';
?>
看起来 PHP 使用了来自此处的表格:http://ascii-code.com/
(而不是来自此处:http://www.asciitable.com/,如文档中所述) 用于代码 128 到 255。
<?php
for ($i = 32; $i <= 255; $i++) {
echo chr($i);
}
?>
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 ; // }
函数 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";
}
?>
我一直在寻找一种简单的方法来构建类似 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 -