현재 위치: > 최신 기사 목록> strtoupper () 함수를 사용할 때 왜 멀티 바이트 문자 세트에 문제가 발생합니까?

strtoupper () 함수를 사용할 때 왜 멀티 바이트 문자 세트에 문제가 발생합니까?

M66 2025-06-22

1. 다중 바이트 문자 세트와 단일 바이트 문자 세트의 차이

먼저, 단일 바이트 문자 세트와 다중 바이트 문자 세트의 차이점을 이해해야합니다. 단일 바이트 문자 세트는 ASCII와 같은 각 문자에 대해 하나의 바이트 공간을 차지하는 문자 세트를 나타냅니다. 각 캐릭터는 0 ~ 255의 정수 범위로 표시 될 수 있습니다.

대조적으로, 다중 바이트 문자 세트 (예 : UTF-8, GB2312, Shift-Jis 등)는 여러 바이트를 사용하여 문자를 나타냅니다. 중국어와 일본어와 같은 언어의 경우 캐릭터가 2, 3 또는 4 바이트를 차지할 수 있습니다.

단일 바이트 문자 세트에서 strtoupper ()는 각 문자의 크기가 일관되고 특별 처리가 필요하지 않기 때문에 원활하게 작동합니다. 그러나 멀티 바이트 문자 세트의 경우이 기능에 문제가있을 수 있습니다.


2. 왜 문제가 있습니까?

strtoupper () 함수는 기본적으로 설정된 단일 바이트 문자를 기반으로하며 문자 바이트 바이트를 확인하고 문자를 대문자로 변환합니다. 멀티 바이트 문자 세트 문자열에서 문자는 여러 바이트에 걸쳐있을 수 있으며, 이로 인해 strtoupper ()가 전체 문자를 올바르게 인식하고 변환하지 못하게합니다.

UTF-8 인코딩을 예로 들어 보면 UTF-8의 문자는 ASCII 문자와 같은 바이트에 해당하지 않습니다. multibyte 문자가 포함 된 문자열에 strtoupper ()를 적용하려고 할 때 멀티 바이트 문자의 일부를 일반 문자로 처리하여 오류 또는 불완전한 변환을 초래할 수 있습니다.

예를 들어:

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-variable">$str</span></span><span> = </span><span><span class="hljs-string">"안녕하세요,world!"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">strtoupper</span></span><span>(</span><span><span class="hljs-variable">$str</span></span><span>);  </span><span><span class="hljs-comment">// 산출: 안녕하세요,WORLD!</span></span><span>
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

위의 코드에서 strtoupper ()는 "world"를 "세계"로 올바르게 변환 할 수 있습니다. 그러나 중국어 "Hello"는 멀티 바이트 문자 세트이므로 아무것도 바꾸지 않았습니다.


3.이 문제를 해결하는 방법은 무엇입니까?

PHP는이 문제를 해결하는 몇 가지 방법을 제공합니다. 가장 일반적인 방법은 MB_Strtoupper () 함수를 사용하는 것입니다. 이 기능은 MBString Extension의 일부이며 멀티 바이트 문자 세트 용으로 설계되었으며 중국어를 포함한 다양한 멀티 바이트 문자를 올바르게 처리 할 수 ​​있습니다.

MB_STRTOUPPER () 함수를 사용하십시오

MB_STRTOUPPER ()는 문자를 멀티 바이트 문자 세트에서 대문자로 올바르게 변환합니다. 이 기능의 기본 사용은 다음과 같습니다.

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-variable">$str</span></span><span> = </span><span><span class="hljs-string">"안녕하세요,world!"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">mb_strtoupper</span></span><span>(</span><span><span class="hljs-variable">$str</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>);  </span><span><span class="hljs-comment">// 산출: 안녕하세요,WORLD!</span></span><span>
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

이 예에서 MB_STRTOUPPER ()는 UTF-8 인코딩 된 중국어를 올바르게 처리하고 "세계"를 "세계"로 변환합니다.

올바른 문자 인코딩을 설정하십시오

MB_STRTOUPPER ()는 명시 적으로 인코딩하는 문자를 지정해야합니다. 실제 개발에서는 항상 UTF-8 인코딩을 사용하는 것이 좋습니다. 이는 다양한 언어로 문자를 처리 할 때 프로그램이 문제가되지 않도록합니다. 인코딩이 지정되지 않으면 MB_STRTOUPPER ()는 시스템의 기본 인코딩에 의존하여 예상치 못한 동작으로 이어질 수 있습니다.

 <span><span><span class="hljs-title function_ invoke__">mb_strtoupper</span></span><span>(</span><span><span class="hljs-variable">$str</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>);
</span></span>

GB2312와 같은 다른 인코딩을 사용하는 경우 다음에 따라 인코딩 매개 변수를 수정할 수 있습니다.

 <span><span><span class="hljs-title function_ invoke__">mb_strtoupper</span></span><span>(</span><span><span class="hljs-variable">$str</span></span><span>, </span><span><span class="hljs-string">'GB2312'</span></span><span>);
</span></span>