>  기사  >  백엔드 개발  >  PHP: 멀티바이트로 나아가다

PHP: 멀티바이트로 나아가다

WBOY
WBOY원래의
2024-08-12 08:35:32732검색

PHP: Going multibytes

멀티바이트 문자는 프로그래밍이 까다로울 수 있습니다.

경고

mbstring은 기본적으로 활성화되어 있지 않습니다. 해당 부분을 먼저 읽어보시기 바랍니다.

멀티바이트 문자열을 사용하는 이유는 무엇입니까?

문서에는 멀티바이트 문자열이 포함될 수 있습니다. PHP에는 문자열에 대한 유용한 도우미가 많이 있지만 이러한 도우미는 단순히 멀티바이트 문자열용이 아닙니다.

특히 문자 수를 계산할 때 불쾌한 버그 및 기타 예상치 못한 오류가 발생할 가능성이 높습니다.

그래서 PHP에서 멀티바이트 문자열 함수를 대신 사용하는 것이 좋습니다.

게다가 mb_trim, mb_ltrim 및 mb_rtrim과 같은 새로운 멀티바이트 문자열 함수는 8.4(이 글을 쓰는 당시 PHP의 다음 릴리스)에서 사용할 수 있습니다.

일부 문자에 여러 바이트가 필요한 이유는 무엇입니까?

영어는 ASCII 문자 집합을 사용하므로 r 또는 s와 같은 문자에는 1바이트만 필요합니다.

반면에 일부 언어에서는 한 문자(최대 6바이트 가능)와 같이 1바이트 이상이 필요한 문자를 사용합니다.

몇 가지 예

문자 개수

$strings = [
    "?????",
    "チャーミング",
    "González",
];

foreach ($strings as $string) {
    echo 'strlen:' . strlen($string) . ' vs. mb_strlen:' . mb_strlen($string) . PHP_EOL;
}

위치 찾기

echo strpos("チャーミング", "ャ"); // gives 3
echo mb_strpos("チャーミング", "ャ"); // gives 1 because 1st position is 0

끈 자르기

echo substr("チャーミング", 3) . PHP_EOL;// ャーミング
echo mb_substr("チャーミング", 3);// ミング

성능에 미치는 영향

mbstring 함수가 상당한 영향을 미칠 수 있다는 내용을 읽을 수도 있습니다.

다음 스크립트를 사용하여 재현할 수도 있습니다.

$cnt = 100000;

$strs = [
    'empty' => '',
    'short' => 'zluty kun',
    'short_with_uc' => 'zluty Kun',
    'long' => str_repeat('this is about 10000 chars long string', 270),
    'long_with_uc' => str_repeat('this is about 10000 chars long String', 270),
    'short_utf8' => 'žlutý kůň',
    'short_utf8_with_uc' => 'Žlutý kŮň',
];

foreach ($strs as $k => $str) {
    $a1 = microtime(true);
    for($i=0; $i < $cnt; ++$i){
        $res = strtolower($str);
    }
    $t1 = microtime(true) - $a1;
    // echo 'it took ' . round($t1 * 1000, 3) . ' ms for ++$i'."\n";

    $a2 = microtime(true);
    for($i=0; $i < $cnt; $i++){
        $res = mb_strtolower($str);
    }
    $t2 = microtime(true) - $a2;
    // echo 'it took ' . round($t2 * 1000, 3) . ' ms for $i++'."\n";

    echo 'strtolower is '.round($t2/$t1, 2).'x faster than mb_strtolower for ' . $k . "\n\n";
}

출처: PHP 버그

mb_* 함수는 속도가 느리지만 항상 절충점이 있으며 이러한 도우미를 사용해야 할지 직접 만들어야 할지 여부는 상황에 따라 결정되어야 합니다.

예를 들어 $cnt = 100000; $cnt = 100; 위 스크립트에서 mb_* 도우미는 여전히 상당히 느리지만 귀하의 경우 최종 영향은 괜찮을 수 있습니다(예: 0.008ms 대 0.004ms).

마무리

특히 다국어 환경에서는 멀티바이트를 고려해야 하며, PHP에는 이를 위한 내장 도우미가 있습니다.

위 내용은 PHP: 멀티바이트로 나아가다의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.