분류 php

PHP의 문자 이스케이프 시퀀스 및 숫자 표기법

컨텐츠 정보

  • 조회 141 (작성일 )

본문

많은 현대 프로그래밍 언어는 간단한 영어 라틴 문자, 숫자, 기호, 이모티콘과 같은 다양한 문자와 줄 바꿈 또는 탭 문자와 같은 다양한 특수 문자를 사용하는 다양한 방법을 지원합니다.


대부분의 문자는 키보드에서 간단히 입력 할 수 있으며 PHP 스니펫에서 있는 그대로 사용할 수 있습니다. 예를 들어, $string = "php.watch"는 PHP에서 완전히 유효한 문자열이고 $num = 42는 완전히 유효한 숫자입니다. 멀티 바이트 문자 (즉, 저장하는 데 2 ​​바이트 이상이 필요한 문자)를 사용할 수도 있으며 완전히 유효합니다 : $emoji = "😻".


다른 많은 프로그래밍 언어 중에서 PHP는 여러 문자 이스케이프 시퀀스를 지원하여 표준 키보드에서 입력 할 수 없거나 텍스트 형식 (예 : 보이지 않는 문자 또는 다양한 제어 문자)으로 표현할 수 없거나 읽을 수 없는 다양한 문자를 사용합니다. 이러한 문자는 PHP가 인식하는 문자 이스케이프 시퀀스를 사용합니다.


숫자의 경우 PHP는 표준 십진수를 지원하지만 이진수, 8 진수, 16 진수 및 과학적 표기법과 같은 다른 표기법을 사용할 수도 있습니다. 다양한 컨텍스트에 따라 코드를 더 읽기 쉽고 명확하게 만들 수 있습니다.


큰 따옴표와 Heredoc 


PHP에서 큰 따옴표 ( "string") 또는 Heredoc (아래 참조)가 있는 문자열은 문자 이스케이프 시퀀스와 변수 보간(variable interpolation)을 지원합니다.

변수 보간은 문자열 리터럴이 큰 따옴표로 묶인 문자열 또는 Heredoc 안에 있으면 PHP가 변수 보간을 시도 함을 의미합니다.


$name = 'John';
echo "Hi $name"; // "Hi John"



$name = 'John';
echo <<<HEREDOC hi $name HEREDOC; // "Hi John"



또는 가급적이면 보간 되는 변수가 더 읽기 쉬운 중괄호일 수 있습니다.


$name = 'John';
echo "Hi {$name}"; // "Hi John"


작은 따옴표로 묶인 문자열 ( 'string')과 Nowdoc 구문은 변수를 보간 하지 않습니다.


$name = 'John';
echo 'Hi $name'; // "Hi $name"



$name = 'John';
echo <<<'NOWDOC'
Hi $name
NOWDOC;
// "Hi $name"


큰 따옴표로 묶인 문자열과 Heredoc 만 문자 이스케이프 시퀀스를 지원합니다.



Character Escaping 


PHP는 큰 따옴표로 묶인 문자열 리터럴과 heredoc 문자열 리터럴 내에서 특수 문자를 해석하고 보간 하기 때문에 백 슬래시 기호 (\)가 "이스케이프 문자"로 사용됩니다.


예를 들어 $name 대신 \$name을 사용하면 PHP가 $name 변수를 보간하지 못합니다.


$name = 'John';
echo "Hi \$name"; // "Hi $name"


두 개의 백 슬래시 문자를 사용하면 백 슬래시 문자 자체가 이스케이프 문자가 되지 않습니다.


$name = 'John';
echo "Hi \\$name"; // "Hi \John"


PHP는 특수 문자에 대해 여러 특수 이스케이프 시퀀스를 지원합니다. 위의 예에서 \$는 이스케이프 시퀀스로 간주됩니다. PHP가 문자 $ 문자를 사용하도록 하여 PHP의 보간을 무효화하기 때문입니다.


Tab Characters: \t and \v 


아마도 가장 간단한 것은 탭 문자 일 것입니다. 문자열 리터럴 내에서 탭 문자를 사용할 수 있지만 \ t를 사용하면 공백 대신 탭 문자가 사용되는 것이 더 분명해집니다. 리터럴 탭 문자 대신 \ t를 사용하면 다양한 IDE가 탭 문자를 공백으로 자동 변경하는 것을 방지 할 수 있습니다.


echo "Foo\tBar";
Foo Bar


\v는 수직 탭입니다. 지원되는 터미널에서 세로 탭 문자는 다음 줄의 다음 문자로 이동합니다.


echo "Foo\vBar\vBaz";
Foo
   Bar
      Baz

New Lines: \r and \n 


\r ( "캐리지 리턴") 및 \n ( "줄 바꿈")은 개행 문자입니다.


역사적으로 다양한 시스템이 \r 또는 \n을 사용하기 시작했으며 Windows도 \r \n을 사용하기 시작했습니다. 예를 들어, Linux 및 MacOS는 기본적으로 "줄 바꿈"문자 (\n)를 개행 문자로 사용하는 반면 Windows는 \r \n (캐리지 리턴 후 줄 바꿈)을 사용합니다. 이전 MacOS 시스템은 \r을 개행 문자로 사용했습니다.


PHP에는 항상 시스템 별 개행 문자를 참조하는 PHP_EOL 상수가 있습니다.


echo "Left\nLeft\nRight\nRight";
Left
Left
Right
Right

Escape character: \e 


이스케이프 문자는 ANSI 이스케이프 시퀀스를 터미널로 보내는 데 자주 사용됩니다. 예를 들어 \ e 다음에 [32m은 터미널에 녹색으로 변경하고 [33m는 노란색으로 변경하도록 지시합니다.


echo "\e[32mGreen text\e[0m \e[33mYellow text\e[0";

위의 코드 조각이 ANSI 이스케이프 시퀀스를 지원하는 터미널에서 실행되면 이를 해석하고 텍스트를 수정합니다.


PHP escape character usage in a terminal 


Form-Feed character: \f 


Form-feed 문자는 페이지 나누기를 위한 ASCII 제어 문자입니다. 프린터는 현재 페이지를 배출하고 다른 페이지의 맨 위에서 시작할 수 있습니다. \ f가 디스플레이 터미널로 전달되면 대부분의 터미널 에뮬레이션 소프트웨어에서 매우 드물지만 화면을 지울 수 있습니다.


Octal ASCII Character Escaping Sequences 


PHP는 8 진수를 ASCII 문자로 이스케이프 하는 것을 지원합니다.


예를 들어, P의 ASCII 문자 (차트 참조)는 십진수로 80입니다. 10 진수 80은  8진수로 120입니다.


P 문자에 8 진 문자 이스케이프 시퀀스를 사용할 수 있습니다.


echo "\120";


P

실제로 다음 표기법으로 모든 기본 ASCII 문자를 나타낼 수 있습니다.


echo "\120\110\120\56\127\141\164\143\150";
PHP.Watch

\0 ~ \377 범위의 모든 값은 8 진 문자 이스케이프 시퀀스로 해석됩니다.


확장 ASCII 문자 (128 ~ 255) 숫자는 UTF-8과 호환되지 않습니다. PHP는 유효한 UTF-8 값이 아니기 때문에 128 (8진수 : 200, 16 진수 : 80) 값을 유효하지 않은 것으로 간주합니다.


PHP는 이러한 값을 허용하지만 UTF-8 컨텍스트에서 유효하지 않은 문자로 간주됩니다.


Hexadecimal ASCII Character Escaping Sequences 


8 진 문자 이스케이프 시퀀스와 유사하게, PHP는 \ x 접두사가 있는 문자 이스케이프 시퀀스에서 16 진수를 허용합니다.


1 바이트 만 허용됩니다. 즉, 유효한 범위는 x0에서 xFF까지입니다. 그러나 UTF-8 제한은 여전히 ​​적용되며 최대 x80의 값만 유효한 문자로 간주됩니다.


또한 16 진수 문자는 대소 문자를 구분하지 않습니다 (즉, AF는 af 및 aF와 동일 함).


ASCII P는 80이며 x50과 같습니다.


echo "\x50";
P

16 진 문자 이스케이프 시퀀스로 동일한 "PHP.Watch"예제를 만들 수 있습니다.


echo "\x50\x48\x50\x2E\x57\x61\x74\x63\x68";
PHP.Watch


Unicode Character Escaping Sequences 


PHP는 \ u 접두사가 있는 모든 유니 코드 문자와 중괄호 안에 있는 코드 포인트의 16 진수 값 사용을 지원합니다.


echo "\u{1F418} - \u{50}\u{48}\u{50}\u{2E}\u{57}\u{61}\u{74}\u{63}\u{68}";
🐘 - PHP.Watch

유니 코드 문자가 10FFFF 값을 초과하면 PHP에서 파서 오류가 발생합니다.


echo "\u{10FFFF1}"
Invalid UTF-8 codepoint escape sequence: Codepoint too large on line ...

10FFFF 상한은 UTF-8 사양이 경계를 U + 0000 및 U + 10FFFF로 선언하기 때문입니다.


이 기사의 이전 버전에서는 현재 수정 된 10FFFF 대신 상한을 FFFFF로 잘못 언급했습니다. 지적 해준 Sara Golemon에게 감사드립니다.


\u{} 유니 코드 표기법은 모든 문자의 이스케이프 시퀀스로 사용할 수 있습니다. 여기 예시들이 있습니다 :


CharacterCode point (Dec)Code point (Hex)Unicode escape sequence
A6541"\u{41}"
B6642"\u{42}"
$3624"\u{24}"
836420AC"\u{20AC}"
\n (line feed)10A"\u{A}"
\r (carriage return)13D"\u{D}"
\t (horizontal tab)99"\u{9}"
\v (vertical tab)11B"\u{B}"
\e (escape)271B"\u{1B}"
\f (form-feed)12C"\u{C}"
🐘1280241F418"\u{1F418}"
3461D85"\u{D85}"
 


Binary Strings 


몇 년 전 PHP 5.2.1은 "이진 문자열"이라는 새로운 문자열 구문을 도입했습니다. 단지 구문 일 뿐이며 곧 출시 될 PHP 6의 호환성 향상을 의미했습니다.


구문은 작은 따옴표 / 큰 따옴표로 묶인 문자열 앞에 b를 붙이는 것이었고, PHP는 이를 바이너리 문자열로 추론 할 수 있습니다.


echo b'Foo';
Foo

is_binary, is_unicodeis_buffer 함수는 PHP 6에서 이진 문자열과 유니 코드 문자열을 구분하기 위한 것이었지만 다음 PHP 7 버전에는 적용되지 않았습니다. 그러나 바이너리 문자열 구문은 PHP 7로 만들었고 PHP 8에서도 계속됩니다.


이진 문자열 구문은 특별한 기능이 없으며 역사적인 잔재, 머리를 당기는 인터뷰 질문, PHP 기사에 대한 유용한 정보 및 혼란스러운 PHP 개발자 이외의 목적으로 사용되지 않습니다.


이 구문은 더 이상 사용되지 않으며 향후 PHP 버전에서 제거 될 예정이 아닙니다.


Numeric Notations 


PHP 스크립트에서 숫자 리터럴을 사용할 때 PHP는 기본적으로 10 진수 값을 예상합니다. 그러나 PHP는 이진수, 8 진수, 16 진수 및 과학적 표기법과 같은 다른 숫자 표기법도 허용합니다.


PHP 7.4부터 PHP는 긴 숫자의 가독성을 높이기 위해 밑줄 숫자 구분 기호도 허용합니다.


Binary Numeric Notation 


접두사 0b로 시작하는 모든 숫자 리터럴은 이진수로 간주됩니다.


$number_binary  = 0b101010;

밑줄 숫자 구분 기호를 사용하면 가독성을 높이기 위해 밑줄을 사용할 수 있습니다.


$number_binary = 0b10_1010;
0b101010  === 42; // true
0b10_1010 === 42; // true


Octal Numeric Notation 


PHP는 접두사가 0 인 8 진수 값을 허용합니다. PHP 8.1부터 PHP는 0O 및 0o 접두사가 있는 명시적인 8 진수 표기법도 지원합니다.


$number_octal = 052; // === Decimal 42
$number_octal = 0o52; // === Decimal 42
$number_octal = 0O52; // === Decimal 42


Hexadecimal Numeric Notation 


16 진수는 \0X 및 \0x 접두사로 해석됩니다.


$number_hex = 0x2A; // === Decimal 42
$number_hex = 0X2A; // === Decimal 42

Scientific Numeric Notation 


PHP는 또한 float 값에 대한 과학적 "E 표기법"을 지원합니다.


$number_float = 42E1;

E 표기법은 42 * 10 ^ 0 (10의 0 제곱)과 같습니다. 많은 프로그래밍 언어 (PHP 포함)에서 ^ 연산자는 XOR에 사용되는 반면 **는 전원에 사용됩니다.


과학적 숫자 표기법의 가독성 이점은 매우 정확하거나 큰 숫자 일 때 더욱 두드러집니다.

$planck_constant    = 6.62607004E-34;
$avogadros_constant = 6.022140857E+23;
3.844E5 === 3.844 * 10**5 === 384400.0; // true


PHP는 다양한 형태의 문자 이스케이프 시퀀스와 숫자 표기법을 지원합니다. 최근에는 0O / 0o 접두사 (PHP 8.1)와 밑줄 숫자 구분 기호 (PHP 7.4)가있는 명시적인 8 진수 표기법을 추가했습니다.


이러한 문자 이스케이프 시퀀스 및 숫자 표기법은 사용자 입력에서 해석되지 않습니다. 예를 들어 밑줄로 구분 된 숫자를 정수로 변환하면 사용자가 제공 한 문자열에 대해 PHP의 밑줄-숫자-구분자 기능을 사용하지 않습니다.


var_dump((int) "2_34_5");
// int(2)

var_dump((int) "0xabcd");
// int(0)


사용자 입력에 사용되는 추가 chraracter 이스케이프 시퀀스도 평가되지 않습니다. 예를 들어 양식이 양식 필드에 "\ 43"을 제출하면 해당 값은 8 진 문자 이스케이프 시퀀스로 해석되지 않고 있는 그대로 사용됩니다. 반대로 $ str = "\ 43"은 PHP 소스 파일에서 평가되기 때문에 동등한 "#"을 생성합니다.


https://php.watch/articles/php-character-escape-sequences-numeric-notations#octal-numeric