PHP에서 chr () 는 매우 기본적이지만 일반적으로 사용되는 기능입니다. 정수 (0–255)가 필요하고 해당 단일 바이트 문자를 반환합니다. 예를 들어, chr (65)는 "a"를 반환합니다. 그러나 제어 문자, 이진 바이트 시퀀스 또는 다중 바이트 (UTF-8) 문자 (예 : 중국어, 이모티콘)와 같은 "특수 문자"를 다룰 때는 chr () 의 한계를 이해하고 원하는 문자열을 생성하기 위해 다른 방법과 협력해야합니다.
다음은 일반적인 관행과 예방 조치를 설명하기위한 몇 가지 시나리오이며, 직접 복사하고 실행할 수있는 예제를 제공합니다.
chr () 가 단일 바이트 문자를 생성하는 데 가장 적합한 것 : 신형, 탭, 보이지 않는 제어 문자 또는 0-255의 바이트 값을 생성하는 데 사용할 수 있습니다.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 수도 A</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">65</span></span><span>); </span><span><span class="hljs-comment">// 산출 A</span></span><span>
</span><span><span class="hljs-comment">// 라인 브레이크(LF)</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"line1"</span></span><span> . </span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">10</span></span><span>) . </span><span><span class="hljs-string">"line2"</span></span><span>;
</span><span><span class="hljs-comment">// 탭 기호(TAB)</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"col1"</span></span><span> . </span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">9</span></span><span>) . </span><span><span class="hljs-string">"col2"</span></span><span>;
</span><span><span class="hljs-comment">// 이진 데이터 조각을 생성합니다</span></span><span>
</span><span><span class="hljs-variable">$bytes</span></span><span> = </span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">0x00</span></span><span>) . </span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">0xFF</span></span><span>) . </span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">0x7A</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">var_dump</span></span><span>(</span><span><span class="hljs-variable">$bytes</span></span><span>); </span><span><span class="hljs-comment">// string(3) "\x00\xFFz"</span></span><span>
</span></span>팁 : 이진 프로토콜, 파일 헤더 또는 네트워크 패키지를 처리 할 때 chr ()는 바이트를 구성하는 데 매우 편리합니다.
한 번에 여러 연속 바이트를 구성하려면 Pack () 가 더 간단하고 많은 스 플라이 싱 chr () 보다 성능이 향상됩니다.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 사용 pack 3 바이트를 생성합니다:0x01 0x02 0x03</span></span><span>
</span><span><span class="hljs-variable">$bin</span></span><span> = </span><span><span class="hljs-title function_ invoke__">pack</span></span><span>(</span><span><span class="hljs-string">'C*'</span></span><span>, </span><span><span class="hljs-number">0x01</span></span><span>, </span><span><span class="hljs-number">0x02</span></span><span>, </span><span><span class="hljs-number">0x03</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">bin2hex</span></span><span>(</span><span><span class="hljs-variable">$bin</span></span><span>); </span><span><span class="hljs-comment">// 산출 "010203"</span></span><span>
</span><span><span class="hljs-comment">// 스 플라이 싱 chr 방법(등가)</span></span><span>
</span><span><span class="hljs-variable">$bin2</span></span><span> = </span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">1</span></span><span>) . </span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">2</span></span><span>) . </span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">3</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">bin2hex</span></span><span>(</span><span><span class="hljs-variable">$bin2</span></span><span>); </span><span><span class="hljs-comment">// "010203"</span></span><span>
</span></span>chr ()는 단일 바이트 만 반환합니다. UTF-8 Multibyte 문자 (Code Point> 0xff)는 chr () 에 의해 직접 생성 할 수 없습니다. 일반적인 대안은 다음과 같습니다.
알려진 유니 코드 코드 포인트 (예 : U+1F600 이모티콘)의 경우 HTML 엔티티를 통해 UTF-8로 변환 할 수 있습니다.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 使사용 HTML 엔티티 세대 이모티콘(예를 들어 ?? U+1F600)</span></span><span>
</span><span><span class="hljs-variable">$emoji</span></span><span> = </span><span><span class="hljs-title function_ invoke__">html_entity_decode</span></span><span>(</span><span><span class="hljs-string">'&#x1F600;'</span></span><span>, ENT_NOQUOTES, </span><span><span class="hljs-string">'UTF-8'</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$emoji</span></span><span> . PHP_EOL;
</span></span>서버에 ext-intl이 활성화 된 경우 유니 코드 코드 포인트를 직접 눌러 문자를 생성 할 수 있습니다.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 필요 ext-intl</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title class_">IntlChar</span></span><span>::</span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">0x4E2D</span></span><span>); </span><span><span class="hljs-comment">// 산출 "가운데"</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title class_">IntlChar</span></span><span>::</span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">0x1F600</span></span><span>); </span><span><span class="hljs-comment">// 산출 ??(표현)</span></span><span>
</span></span>알려진 문자의 UTF-8 16 진수 바이트 시퀀스 인 경우 바이트 문자열을 직접 구성 할 수 있습니다.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// "가운데" ~의 UTF-8 인코딩은입니다 E4 B8 AD</span></span><span>
</span><span><span class="hljs-variable">$zh</span></span><span> = </span><span><span class="hljs-title function_ invoke__">hex2bin</span></span><span>(</span><span><span class="hljs-string">'e4b8ad'</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$zh</span></span><span>; </span><span><span class="hljs-comment">// 산출 가운데</span></span><span>
</span><span><span class="hljs-comment">// 표현 ?? ~의 UTF-8 인코딩은입니다 F0 9F 98 80</span></span><span>
</span><span><span class="hljs-variable">$emoji</span></span><span> = </span><span><span class="hljs-title function_ invoke__">hex2bin</span></span><span>(</span><span><span class="hljs-string">'f09f9880'</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$emoji</span></span><span>; </span><span><span class="hljs-comment">// 산출 ??</span></span><span>
</span></span>참고 : 여기에서 HEX2BIN ()은 UTF-8의 바이트 값을 직접 작성하며, 이는 바이트 시퀀스 (예 : 사양 또는 네트워크 패킷 캡처)를 아는 경우에 적합합니다.
정수 지점이있는 경우 (추가 확장에 의존하지 않고) UTF-8 문자로 변환하는 일반적인 기능이 필요합니다. 간단한 변환 직접 구현할 수 있습니다 (다음은 예제 구현입니다).
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">codepoint_to_utf8</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-keyword">int</span></span></span><span> </span><span><span class="hljs-variable">$cp</span></span><span>): </span><span><span class="hljs-title">string</span></span><span> {
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$cp</span></span><span> <= </span><span><span class="hljs-number">0x7F</span></span><span>) {
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-variable">$cp</span></span><span>);
} </span><span><span class="hljs-keyword">elseif</span></span><span> (</span><span><span class="hljs-variable">$cp</span></span><span> <= </span><span><span class="hljs-number">0x7FF</span></span><span>) {
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">0xC0</span></span><span> | (</span><span><span class="hljs-variable">$cp</span></span><span> >> </span><span><span class="hljs-number">6</span></span><span>)) .
</span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">0x80</span></span><span> | (</span><span><span class="hljs-variable">$cp</span></span><span> & </span><span><span class="hljs-number">0x3F</span></span><span>));
} </span><span><span class="hljs-keyword">elseif</span></span><span> (</span><span><span class="hljs-variable">$cp</span></span><span> <= </span><span><span class="hljs-number">0xFFFF</span></span><span>) {
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">0xE0</span></span><span> | (</span><span><span class="hljs-variable">$cp</span></span><span> >> </span><span><span class="hljs-number">12</span></span><span>)) .
</span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">0x80</span></span><span> | ((</span><span><span class="hljs-variable">$cp</span></span><span> >> </span><span><span class="hljs-number">6</span></span><span>) & </span><span><span class="hljs-number">0x3F</span></span><span>)) .
</span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">0x80</span></span><span> | (</span><span><span class="hljs-variable">$cp</span></span><span> & </span><span><span class="hljs-number">0x3F</span></span><span>));
} </span><span><span class="hljs-keyword">elseif</span></span><span> (</span><span><span class="hljs-variable">$cp</span></span><span> <= </span><span><span class="hljs-number">0x10FFFF</span></span><span>) {
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">0xF0</span></span><span> | (</span><span><span class="hljs-variable">$cp</span></span><span> >> </span><span><span class="hljs-number">18</span></span><span>)) .
</span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">0x80</span></span><span> | ((</span><span><span class="hljs-variable">$cp</span></span><span> >> </span><span><span class="hljs-number">12</span></span><span>) & </span><span><span class="hljs-number">0x3F</span></span><span>)) .
</span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">0x80</span></span><span> | ((</span><span><span class="hljs-variable">$cp</span></span><span> >> </span><span><span class="hljs-number">6</span></span><span>) & </span><span><span class="hljs-number">0x3F</span></span><span>)) .
</span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">0x80</span></span><span> | (</span><span><span class="hljs-variable">$cp</span></span><span> & </span><span><span class="hljs-number">0x3F</span></span><span>));
}
</span><span><span class="hljs-keyword">throw</span></span><span> </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">InvalidArgumentException</span></span><span>(</span><span><span class="hljs-string">'Invalid Unicode code point'</span></span><span>);
}
</span><span><span class="hljs-comment">// 使사용</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">codepoint_to_utf8</span></span><span>(</span><span><span class="hljs-number">0x4E2D</span></span><span>); </span><span><span class="hljs-comment">// 가운데</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">codepoint_to_utf8</span></span><span>(</span><span><span class="hljs-number">0x1F600</span></span><span>); </span><span><span class="hljs-comment">// ??</span></span><span>
</span></span>이 함수는 여전히 chr ()를 사용하여 각 UTF-8 바이트를 구성하는데, 이는 순수한 PHP의 일반적인 솔루션입니다.
chr () 의 매개 변수 범위 : 단일 바이트 (0–255)에만 적용됩니다. 255보다 큰 값을 전달하면 자르기 (8 비트를 낮추는 것)를 유발할 수 있으며, 이는 일반적으로 원하는 동작이 아닙니다.
인코딩 환경 : 멀티 파이트 문자를 처리 할 때 문자열이 UTF-8으로 인코딩되고 관련 기능 (예 : JSON_ENCODE , Strlen ) 이 MB_* 시리즈를 사용하거나 올바른 인코딩을 지정하도록주의해야합니다.
디스플레이 및 전송 : 일부 환경 (터미널, HTTP 헤더, 데이터베이스 열)은 인코딩에 민감합니다. UTF-8 문자를 구성한 후 출력 또는 스토리지시 올바른 인코딩을 선언해야합니다 (예 : <meta charset = "utf-8">을 HTML 페이지에 추가하거나 컨텐츠 유형을 설정하십시오 : text/html; charset = utf-8 ).
우선 도구 : 유니 코드 코드 포인트 만 처리 해야하는 경우 intlchar :: chr () (사용 가능한 경우) 또는 MB_* / 변환 기능이 의미론이므로 오류가 적기 때문에 사용하십시오.
<span><span><span class="hljs-comment">// 단일 바이트 문자</span></span><span>
</span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">65</span></span><span>); </span><span><span class="hljs-comment">// "A"</span></span><span>
</span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">10</span></span><span>); </span><span><span class="hljs-comment">// LF 라인 브레이크</span></span><span>
</span><span><span class="hljs-comment">// 다중 바이트 / Unicode 대안</span></span><span>
</span><span><span class="hljs-title function_ invoke__">html_entity_decode</span></span><span>(</span><span><span class="hljs-string">'&#x1F600;'</span></span><span>, ENT_NOQUOTES, </span><span><span class="hljs-string">'UTF-8'</span></span><span>); </span><span><span class="hljs-comment">// ??</span></span><span>
</span><span><span class="hljs-title class_">IntlChar</span></span><span>::</span><span><span class="hljs-title function_ invoke__">chr</span></span><span>(</span><span><span class="hljs-number">0x4E2D</span></span><span>); </span><span><span class="hljs-comment">// "가운데"(필요 ext-intl)</span></span><span>
</span><span><span class="hljs-title function_ invoke__">hex2bin</span></span><span>(</span><span><span class="hljs-string">'e4b8ad'</span></span><span>); </span><span><span class="hljs-comment">// "가운데"(直接사용 UTF-8 16 진 바이트)</span></span><span>
</span><span><span class="hljs-comment">// 코드 포인트를 변환합니다 UTF-8(见上面~의 codepoint_to_utf8)</span></span><span>
</span></span>chr ()는 단일 바이트 (0–255) 문자 및 이진 데이터를 생성 할 때 매우 간단하고 직접적입니다. 그러나 다중 바이트 유니 코드 문자 (중국어, 이모티콘)에 직면 할 때 intlchar :: chr () , HTML 엔티티 변환, Hex2bin () 또는 사용자 정의 코드-투 -UTF-8 전환 기능으로 신뢰할 수있는 결과를 얻을 필요가 있습니다. 특정 시나리오 (네트워크 프로토콜, 파일 처리, 웹 페이지 출력)에 따라 적절한 방법을 선택하고 일관성을 인코딩하는 데주의를 기울이면 다양한 "특수 문자"문자열을 안정적으로 생성 할 수 있습니다.