문자열 처리 메커니즘 수정


1. 16진수 문자가 포함된 문자열은 더 이상 숫자로 처리되지 않습니다.

16진수 문자가 포함된 문자열은 더 이상 숫자로 처리되지 않으며 다르게 처리되지 않습니다. 예를 들어, 다음 코드는:

var_dump("0x123" == "291");     // bool(false)     (previously true)
var_dump(is_numeric("0x123"));  // bool(false)     (previously true)
var_dump("0xe" + "0x1");        // int(0)          (previously 16)
var_dump(substr("foo", "0x1")); // string(3) "foo" (previously "oo")
// Notice: A non well formed numeric value encountered
는 filter_var 함수를 사용하여 문자열에 16진수 문자가 포함되어 있는지 또는 정수
$str = "0xffff";
$int = filter_var($str, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX);
if (false === $int) {
    throw new Exception("Invalid integer!");
}
var_dump($int); // int(65535)
로 변환될 수 있는지 여부를 확인할 수 있습니다.

2. 나중에 u{에 잘못된 문자가 포함되면 오류가 보고됩니다

큰따옴표 및 heredocs 유니코드 코드 포인트 이스케이프 구문이 문법에 추가되었습니다. "u{" 뒤에는 UTF-8 문자가 와야 합니다. UTF-8이 아닌 문자인 경우 오류가 보고됩니다.

$str = "\u{xyz}"; // Fatal error: Invalid UTF-8 codepoint escape sequence
는 첫 번째 문자를 이스케이프 처리하여 이 오류를 피할 수 있습니다.
 $str = "\u{xyz}"; // Works fine

"u" 뒤에 {가 없으면 효과가 없습니다.

$str = "\u202e"; // Works fine

PHP IntlChar()

PHP 7은 intl 확장을 통해 국제화(i18n)와 지역화(l10n)를 지원합니다. 이 확장은 ICU 라이브러리의 기본 래퍼일 뿐이며 ICU 라이브러리와 유사한 방법과 기능을 제공합니다.

PHP 7은 새로운 IntlChar 클래스를 통해 ICU의 유니코드 문자 기능을 노출합니다. 이 클래스 자체는 여러 문자 집합에서 유니코드 문자를 조작하기 위한 많은 정적 메서드를 정의합니다.

Example

<?php
printf('%x', IntlChar::CODEPOINT_MAX);
echo IntlChar::charName('@');
var_dump(IntlChar::ispunct('!'));
?>

위 프로그램 실행의 출력 결과는 다음과 같습니다.

10ffff
COMMERCIAL AT
bool(true)