멀티 바이트 문자열 처리에 PHP를 사용하는 경우 MB_GET_INFO () 및 MB_STRTOLOWER () 는 두 가지 일반적인 멀티 바이트 함수입니다. 그러나이 두 기능이 함께 사용될 때, 문자 세트 설정이 무시되면, 특히 중국어, 일본, 러시아 등과 같은 비 ASCII 문자를 다룰 때 예기치 않은 문자열 처리 문제가 발생할 수 있습니다.
이 기사는 일반적인 문제와 올바른 문자 세트 구성으로이를 피하는 방법을 탐색합니다.
PHP의 MB_STRTOLOWER () 함수는 멀티 바이트 문자열을 소문자로 변환하는 데 사용되지만 현재 멀티 파이트 문자 세트 환경에 의존합니다. 이 환경은 mb_internal_encoding () 에 의해 설정되며 함수가 호출 될 때 문자 세트 매개 변수를 전달하여 재정의 할 수도 있습니다.
mb_get_info () 함수는 기본 문자 세트 정보를 포함하여 현재 멀티 바이트 구성을 얻는 데 사용됩니다. MB_STRTOLOWER () 가 부적절한 문자 세트 구성으로 호출되면 멀티 바이트 문자열 (특히 UTF-8)을 처리 할 때는 차량 코드 또는 잘못된 변환이 발생할 수 있습니다.
다음은 일반적인 예입니다.
<?php
mb_internal_encoding("ISO-8859-1"); // NON으로 잘못 설정했습니다 UTF-8 코딩
$str = "üBERGANG";
$lower = mb_strtolower($str); // 지정된 문자 세트가 없습니다
echo $lower;
?>
출력은 예상 übergang이 아니라 오히려 차가워 지거나 변하지 않을 수 있습니다. 이는 현재 문자 세트가 UTF-8이 아니기 때문에 함수가 멀티 바이트 문자를 올바르게 인식하지 못하게하기 때문입니다.
mb_get_info ()를 사용하여 현재 인코딩 설정을보십시오.
<?php
print_r(mb_get_info());
?>
출력의 "Internal_encoding" 필드가 핵심이며, 여기서 "UTF-8" 이 아닌 경우 환경이 다국어 컨텐츠를 처리하는 데 적합하지 않을 수 있음을 의미합니다.
<?php
mb_internal_encoding("UTF-8"); // 전 세계적으로 설정됩니다 UTF-8
$str = "üBERGANG";
$lower = mb_strtolower($str);
echo $lower; // 산출:übergang
?>
<?php
$str = "üBERGANG";
$lower = mb_strtolower($str, "UTF-8");
echo $lower; // 산출:übergang
?>
이 방법은 더 강력하며 시스템 기본 인코딩이 UTF-8이 아닌 경우에도 영향을받지 않습니다.
웹 양식, API, 데이터베이스 등에서 입력 데이터를 처리 할 때 인코딩 통합을 무시하기가 쉽습니다. 예를 들어, 프론트 엔드는 UTF-8 인코딩을 사용하여 문자열을 통과하지만 백엔드 PHP 환경은 여전히 ISO-8859-1을 사용하므로 문자열 작동이 실패합니다.
따라서 전체 시스템이 UTF-8 인코딩을 균일하게 사용하도록하는 것이 그러한 문제를 피하는 기본적인 방법입니다.
mb_get_info ()를 사용하여 구성을보고 "내부_encoding" 이 "UTF-8" 인지 확인하십시오.
기본값에 대한 의존성을 피하기 위해 항상 문자 세트를 멀티 바이트 함수로 명시 적으로 전달합니다.
추가와 같은 입구에 설정된 문자를 설정하십시오.
mb_internal_encoding("UTF-8");
mb_http_output("UTF-8");
mb_regex_encoding("UTF-8");
URL 매개 변수를 처리 할 때는 MB_CONVERTT_ENCODING ()을 사용하여 입력을 변환해야합니다.
$url = "https://gitbox.net/über";
$url_utf8 = mb_convert_encoding($url, "UTF-8", "auto");
일반적인 문자 세트 문제는 일반적으로 mb_get_info ( ) 와 함께 사용될 때 UTF-8이 아닌 기본 인코딩에서 비롯됩니다. 이러한 문제는 균일하게 문자 세트를 확인하고 설정하거나 함수를 호출 할 때 문자 세트를 수동으로 지정하여 다국어 텍스트를 처리 할 때 프로그램의 정확성과 안정성을 보장함으로써 효과적으로 피할 수 있습니다.
캐릭터 세트 혼돈은 국제 프로젝트에서 가장 숨겨져 있지만 치명적인 문제 중 하나라는 것을 항상 기억하십시오. 인코딩을 명시 적으로 설정하는 것을 두려워하는 것보다 오히려 더 복잡합니다. 예방은 디버깅보다 훨씬 낫습니다.