MB_Strcut는 PHP를 사용하여 멀티 바이트 스트링을 처리 할 때 매우 실용적인 기능입니다. 전통적인 서브 스트스트 와 같은 멀티 바이트 문자를 잘라서 발생하는 코드 문제없이 지정된 바이트 길이를 가로 채울 수 있습니다. 그러나 데이터베이스에서 문자열을 운영 할 때, 특히 다국어 컨텐츠 및 인코딩 변환과 관련하여 MB_STRCUT 의 사용도 일부 오류가 발생하기 쉽습니다. 이 기사에서는 이러한 일반적인 오류와 회피를 자세히 분석합니다.
MB_STRCUT는 문자 수가 아닌 문자열에서 지정된 바이트 수를 잘라내는 것입니다. 다중 바이트 인코딩 용으로 설계되었으며 다중 바이트 문자를 잘라서 발생하는 차량 코드를 피하십시오.
기능 프로토 타입은 다음과 같습니다.
mb_strcut(string $string, int $start, int $length = null, string $encoding = null): string
$ 문자열 : 문자열을 입력하십시오.
$ 시작 : 시작 바이트 위치.
$ 길이 : 가로 채는 바이트 길이 (선택 사항).
$ 인코딩 : 문자 인코딩, 기본값은 내부 인코딩입니다.
데이터베이스에 저장된 문자열 인코딩은 MB_Strcut 에서 사용하는 인코딩과 일치하지 않으므로 비정상적인 차단 결과가 발생합니다. 예를 들어, 데이터베이스 필드는 UTF-8 인코딩이지만 프로그램은 기본 내부 인코딩 (아마도 ISO-8859-1)을 사용하므로 바이트 자르기 위치 오류가 발생합니다.
오류 징후 :
인터셉트 결과는 차단되고 캐릭터는 불완전하며 프로그램도 예외를 던집니다.
피하는 방법 :
예를 들어 $ 인코딩을 식별하십시오.
mb_strcut($string, 0, 10, 'UTF-8');
데이터베이스 연결 및 쿼리 결과의 인코딩이 프로그램의 인코딩과 일치하는지 확인하십시오. MySQL은 다음과 같이 실행할 수 있습니다.
SET NAMES 'utf8mb4';
또는 PDO 연결 시점을 지정하십시오.
new PDO('mysql:host=...;dbname=...', $user, $pass, [
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4"
]);
mb_strcut 의 $ start 매개 변수는 문자 위치가 아닌 바이트 위치입니다. 개발자가 바이트 위치로 캐릭터 위치를 전달하는 데 익숙한 경우 위치 편차를 가로 채 웁니다.
오류 징후 :
가로 채는 문자열은 기대치에서 시작하여 문자가 누락되거나 거절 될 수 있습니다.
피하는 방법 :
MB_STRPOS를 사용하여 바이트 위치를 얻을 때 동일한 인코딩을 지정하십시오.
문자 위치를 사용하려면 먼저 문자 위치를 바이트 위치로 변환해야합니다.
예:
$pos_char = 3; // 1.3캐릭터
$pos_byte = strlen(mb_substr($string, 0, $pos_char, 'UTF-8'));
$result = mb_strcut($string, $pos_byte, 10, 'UTF-8');
$ 길이는 바이트 길이입니다. 가로 채기 길이가 다중 바이트 문자 중간에 있으면 MB_Strcut는 전체 문자 경계로 안전하게 자르지 만 논리 오류로 인해 길이가 부적절하게 설정되면 차단 효과에 영향을 줄 수 있습니다.
피하는 방법 :
요구 사항에 따라 바이트 길이를 합리적으로 계산하십시오.
고정 된 수의 문자를 가로 채려면 mb_substr 와 함께 사용할 수 있습니다.
중국 문자열이 데이터베이스에 저장되어 있다고 가정하면 처음 10 바이트를 가로 채려고합니다.
<?php
// 데이터베이스에서 문자열을 가져옵니다
$string = "안녕하세요,환영mb_strcut기능!";
// 인코딩을 지정합니다
$encoding = 'UTF-8';
// 인터셉트 전10바이트
$result = mb_strcut($string, 0, 10, $encoding);
echo $result;
?>
이 예에서 MB_STRCUT는 중국어의 절반이 잘리지 않고 출력 문자열이 차단되지 않도록합니다.
mb_strcut를 사용하는 경우 명확하게 인코딩하고 데이터베이스 인코딩과 일치하십시오.
$ start 와 $ 길이는 문자 단위가 아닌 바이트 단위이므로 신중하게 계산해야합니다.
불일치를 인코딩하여 오류를 피하기 위해 데이터베이스 문자 세트 설정과 조정하십시오.
문자 인터셉트의 경우 MB_SUBSTR을 사용하는 것이 좋습니다. MB_STRCUT 는 바이트 인터셉트가 가로 채는 시나리오에 더 적합합니다.
위의 기술을 마스터하면 MB_Strcut의 데이터베이스 문자열 처리에서 일반적인 오류를 효과적으로 피할 수 있으며 프로그램이 정확하고 안전한 멀티 바이트 문자열을 출력 할 수 있습니다.
<?php
// 예:데이터베이스에서 간단한 멀티 바이트 문자열을 보안하십시오
// 데이터베이스가 연결되어 있다고 가정하십시오,그리고 캐릭터 세트는입니다utf8mb4
// 데이터베이스에서 문자열을 읽으십시오
$query = "SELECT content FROM articles WHERE id = 1";
$result = $pdo->query($query);
$row = $result->fetch(PDO::FETCH_ASSOC);
$content = $row['content'];
$encoding = 'UTF-8';
// 인터셉트 전50바이트,Barled Code를 피하십시오
$snippet = mb_strcut($content, 0, 50, $encoding);
echo $snippet;
?>
멀티 바이트 스트링 처리에 대해 자세히 알아 보려면 다음을 방문 할 수 있습니다.
https://gitbox.net/php/manual/zh/function.mb-Strcut.php