현재 위치: > 최신 기사 목록> Sprintf를 사용하여 중국어를 처리 할 때 정렬 예외가 발생하면 어떻게해야합니까?

Sprintf를 사용하여 중국어를 처리 할 때 정렬 예외가 발생하면 어떻게해야합니까?

gitbox 2025-04-28

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 함수가 바이트 너비가 아닌 문자열 너비별로 문자열을 처리해야합니다. 두 가지 방법으로 달성 할 수 있습니다.

1. 멀티 바이트 스트링 함수를 사용하십시오

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 함수를 사용하여 문자열을 채우기 위해 한자가 문자 너비로 정렬되도록합니다.

2. 수동으로 문자 너비를 계산합니다

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을 사용하여 문자 너비를 계산하거나 문자 너비를 수동으로 계산 하여이 문제를 해결할 수 있습니다. 어느 쪽이든, 출력시 예상대로 한자가 정렬되도록하여 출력 포맷의 오류를 피합니다.