PHP에서 Sprintf 는 매우 일반적으로 사용되는 형식의 출력 기능입니다. 지정된 형식에 따라 변수를 문자열로 형식화 할 수 있으며 텍스트 출력, 로깅 및 데이터 표시와 같은 시나리오에서 종종 사용됩니다. 그러나 Sprintf 함수를 사용하여 중국어를 처리 할 때 정렬 예외 문제가 발생할 수 있습니다. 이 기사는이 문제가 발생하는 이유를 탐색하고 해당 솔루션을 제공합니다.
Sprintf 함수를 사용하는 경우, 형식의 문자열은 일반적으로 정렬, 필드 너비 등과 같은 매개 변수를 지정하도록 설정됩니다. 예를 들어, 공통 형식 문자열은 %10 이므로 폭이 10 인 문자열이 출력이 오른쪽으로 정렬되어 있음을 나타냅니다. 들어오는 데이터 길이가 10 미만인 경우 Sprintf는 지정된 폭에 도달 할 때까지 왼쪽의 공간을 자동으로 채우게됩니다.
그러나 한자를 다룰 때 상황이 복잡해집니다. 중국어의 인코딩은 일반적으로 UTF-8이며 각 중국어는 3 바이트를 차지할 수 있으며 Sprintf는 문자 너비가 아닌 기본적으로 바이트별로 필드 너비를 계산합니다. 따라서 중국어로 전달하면 Sprintf 는 여러 바이트로 계산하여 정렬 예외를 만듭니다.
예를 들어:
$str = sprintf("%10s", "안녕하세요");
echo $str;
UTF-8 인코딩에서 "hello"는 2 자 대신 6 바이트로 구성되므로 Sprintf 로 계산 된 너비는 우리의 기대치를 충족시키지 않으므로 출력시 정렬 문제가 발생합니다.
이 문제를 해결하려면 Sprintf 함수가 바이트 너비가 아닌 문자열 너비별로 문자열을 처리해야합니다. 두 가지 방법으로 달성 할 수 있습니다.
PHP는 중국어를 올바르게 처리하는 데 사용할 수있는 다중 바이트 스트링 처리 기능 라이브러리 (MBString)를 제공합니다. mb_strlen이 문자열의 길이를 계산하는 데 사용되면 바이트가 아닌 문자별로 계산됩니다.
예를 들어:
// 문자열 너비를 설정하십시오
$str = "안녕하세요";
$width = 10;
$len = mb_strlen($str, 'UTF-8'); // 문자 수를 얻으십시오
// 채우기 공간 수를 계산하십시오
$padding = $width - $len;
// 양쪽에 공간을 채우십시오
$formatted = str_pad($str, $width, " ", STR_PAD_LEFT);
echo $formatted;
MB_STRLEN을 통해 문자열의 문자 수를 얻은 후 STR_PAD 함수를 사용하여 문자열을 채우기 위해 한자가 문자 너비로 정렬되도록합니다.
MBString 확장이 활성화되지 않으면 각 문자의 너비도 수동으로 계산할 수 있습니다. 예를 들어, UTF-8 인코딩 된 중국어의 경우, 폭은 PHP의 문자별로 문자별로 계산 될 수 있으며이 너비에서 처리 될 수 있습니다. 이 방법은 비교적 복잡하지만 일관되지 않은 바이트와 문자 너비의 문제를 피할 수도 있습니다.
function get_char_width($str) {
$width = 0;
$len = mb_strlen($str, 'UTF-8');
for ($i = 0; $i < $len; $i++) {
$char = mb_substr($str, $i, 1, 'UTF-8');
// 한자가 점령한다고 가정합니다 2 문자 너비
if (preg_match("/[\x{4e00}-\x{9fa5}]/u", $char)) {
$width += 2; // 중국어 너비
} else {
$width += 1; // 영어 문자 너비
}
}
return $width;
}
// 예
$str = "안녕하세요";
$width = 10;
$char_width = get_char_width($str);
// 채우기 공간 수를 계산하십시오
$padding = $width - $char_width;
$formatted = str_pad($str, $width + $padding, " ", STR_PAD_LEFT);
echo $formatted;
이 메소드는 문자별로 폭을 분석하고 str_pad를 사용하여 공백을 채워 문자열의 올바른 정렬을 보장합니다.
요약하면, Sprintf 함수는 기본적으로 바이트 너비를 사용하여 형식화되므로 중국어를 처리 할 때 정렬 예외가 발생합니다. MBString 함수 라이브러리에서 mb_strlen을 사용하여 문자 너비를 계산하거나 문자 너비를 수동으로 계산 하여이 문제를 해결할 수 있습니다. 어느 쪽이든, 출력시 예상대로 한자가 정렬되도록하여 출력 포맷의 오류를 피합니다.