현재 위치: > 최신 기사 목록> Convert_Cyr_String 함수를 사용하는 실용적인 팁은 CODE 문제를 피하기 위해 URL 매개 변수를 인코딩하고 변환하는 데 도움이됩니다.

Convert_Cyr_String 함수를 사용하는 실용적인 팁은 CODE 문제를 피하기 위해 URL 매개 변수를 인코딩하고 변환하는 데 도움이됩니다.

gitbox 2025-09-17

1. 문제 시나리오 및 아이디어에 대한 개요

일반적인 프로세스는 다음과 같습니다. 브라우저 또는 클라이언트 URL은 매개 변수를 인코딩하고이를 보냅니다 (예 : ? name =%e4%f0%e0%e2%e5%f2 ), 서버는 백분율 부호에 의해 탈출 된 바이트 시퀀스를 수신합니다. 올바른 UTF-8 텍스트로 복원하려면 일반적으로 두 단계가 필요합니다.

  1. 원래 바이트 시퀀스를 얻기 위해 URL 인코딩 ( rawurldecode / urldecode )을 디코딩합니다. php.net +1

  2. 이 바이트 시퀀스를 올바른 단일 바이트 인코딩 (예 : Windows-1251, KOI8-R, CP866 등)에서 UTF-8로 변환하십시오. 일반적인 키릴 인코딩의 경우 Convert_Cyr_String은 서버 PHP 버전에서 지원할 때 문자 세트 변환을 완료 할 수 있습니다. php.net

참고 : Convert_Cyr_String 은 PHP 7.4 이후 더 이상 사용되지 않고 PHP 8.0에서 제거되었습니다. MB_CONVERT_ENCODING / ICONV 또는 타사 UTF-8 라이브러리는 새로운 환경에서 먼저 사용해야합니다. 호환성 및 대체 솔루션은 다음과 같습니다. php.net


2. conver_cyr_string 이 지원하는 인코딩 코드 (간결함)

convert_cyr_string (String $ str, String $, String $ to)은 단일 문자 식별 코드를 사용하며 공통 식별은 다음과 같습니다.

  • K -KOI8-R

  • W -Windows-1251

  • I -ISO-8859-5

  • A / D -X-CP866 (DOS CP866)

  • M -X-Mac-Cyrillic. php.net


3. 실제 코드 템플릿 ( Convert_cyr_string 기반)

실용적인 PHP 기능은 다음과 같습니다. URL 인코딩 될 수있는 문자열을 받고 일종의 사이릴 인코딩 된 문자열 (쿼리 문자열 또는 경로 세그먼트), 디코딩 및 UTF-8로 변환합니다. 참고 : 사용하기 전에 PHP 버전이 여전히 Convert_cyr_string (PHP ≤ 7.3)을 지원하는지 확인하십시오. 실행중인 환경이 PHP 8+ 인 경우 다음 섹션으로 건너려면 대안을 확인하십시오.

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
<span class="hljs-comment">/**
 * 할 것이다 URL 매개 변수(단일 바이트 키릴 릭에 대해 인코딩되어 퍼센트 부호로 탈출 할 수 있습니다.)표준화 UTF-8 끈。
 *
 * $rawUrlPart: 원래의 URL 부분(예를 들어 $_GET['name'],또는 PATH_INFO/경로에서 얻은 조각)
 * $sourceCode: 소스 코드 식별,사용 convert_cyr_string 단일 문자 코드('w','k','i','a','d','m')
 *
 * 반품 UTF-8 끈(若无法转换则반품원래의经过 rawurldecode 的끈)
 */</span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">normalize_cyrillic_url_param</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-keyword">string</span></span></span><span> </span><span><span class="hljs-variable">$rawUrlPart</span></span><span>, </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$sourceCode</span></span><span> = </span><span><span class="hljs-string">'w'</span></span><span>): </span><span><span class="hljs-title">string</span></span><span> {
    </span><span><span class="hljs-comment">// 先把百分号转义还原~을 위한원래의字节</span></span><span>
    </span><span><span class="hljs-variable">$decoded</span></span><span> = </span><span><span class="hljs-title function_ invoke__">rawurldecode</span></span><span>(</span><span><span class="hljs-variable">$rawUrlPart</span></span><span>); </span><span><span class="hljs-comment">// 바이트 예약,하지 않다 + 우주로 돌아갑니다(적용 가능 path segment);만약 query 그리고 있습니다 +,사용 가능 urldecode()</span></span><span>
    
    </span><span><span class="hljs-comment">// 시스템이있는 경우 convert_cyr_string(알아채다:존재하다 PHP 8+ 제거됨)</span></span><span>
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">function_exists</span></span><span>(</span><span><span class="hljs-string">'convert_cyr_string'</span></span><span>)) {
        </span><span><span class="hljs-comment">// 먼저 단일 바이트를 인코딩하십시오(sourceCode)변환 windows-1251('w'),</span></span><span>
        </span><span><span class="hljs-comment">// 그 다음에 windows-1251 로 돌아갑니다 UTF-8(사용 mb_convert_encoding)</span></span><span>
        </span><span><span class="hljs-variable">$asWin1251</span></span><span> = </span><span><span class="hljs-title function_ invoke__">convert_cyr_string</span></span><span>(</span><span><span class="hljs-variable">$decoded</span></span><span>, </span><span><span class="hljs-variable">$sourceCode</span></span><span>, </span><span><span class="hljs-string">'w'</span></span><span>);
        </span><span><span class="hljs-comment">// 할 것이다 windows-1251 二进制字节로 돌아갑니다 UTF-8 끈</span></span><span>
        </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">function_exists</span></span><span>(</span><span><span class="hljs-string">'mb_convert_encoding'</span></span><span>)) {
            </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">mb_convert_encoding</span></span><span>(</span><span><span class="hljs-variable">$asWin1251</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>, </span><span><span class="hljs-string">'Windows-1251'</span></span><span>);
        } </span><span><span class="hljs-keyword">else</span></span><span> {
            </span><span><span class="hljs-comment">// 백업으로,노력하다 iconv(좋다果사용 가능)</span></span><span>
            </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">function_exists</span></span><span>(</span><span><span class="hljs-string">'iconv'</span></span><span>)) {
                </span><span><span class="hljs-variable">$utf8</span></span><span> = @</span><span><span class="hljs-title function_ invoke__">iconv</span></span><span>(</span><span><span class="hljs-string">'CP1251'</span></span><span>, </span><span><span class="hljs-string">'UTF-8//IGNORE'</span></span><span>, </span><span><span class="hljs-variable">$asWin1251</span></span><span>);
                </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$utf8</span></span><span> !== </span><span><span class="hljs-literal">false</span></span><span> ? </span><span><span class="hljs-variable">$utf8</span></span><span> : </span><span><span class="hljs-variable">$asWin1251</span></span><span>;
            }
            </span><span><span class="hljs-comment">// 都不사용 가능时,반품원래의解码끈</span></span><span>
            </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$asWin1251</span></span><span>;
        }
    }

    </span><span><span class="hljs-comment">// 그렇지 않다면 convert_cyr_string(좋다 PHP 8+),直接반품원래의解码끈,让调用方사용替代方案</span></span><span>
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$decoded</span></span><span>;
}
</span></span>

예제 사용 :

 <span><span><span class="hljs-comment">// 가정 URL ~을 위한: /?name=%D0%9C%D0%B8%D1%80</span></span><span>
</span><span><span class="hljs-variable">$raw</span></span><span> = </span><span><span class="hljs-variable">$_GET</span></span><span>[</span><span><span class="hljs-string">'name'</span></span><span>] ?? </span><span><span class="hljs-string">''</span></span><span>;
</span><span><span class="hljs-variable">$name</span></span><span> = </span><span><span class="hljs-title function_ invoke__">normalize_cyrillic_url_param</span></span><span>(</span><span><span class="hljs-variable">$raw</span></span><span>, </span><span><span class="hljs-string">'w'</span></span><span>); </span><span><span class="hljs-comment">// 가정客户端以 Windows-1251 보내다</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$name</span></span><span>; </span><span><span class="hljs-comment">// 출력이 정확합니다 UTF-8 이름</span></span><span>
</span></span>

% 이스케이프의 디코딩은 매개 변수 소스 rawldecode () (경로 세그먼트에 더 적합) 또는 urldecode () 에 따라 선택해야합니다 ( +가 쿼리 문자열의 공간을 나타내는 경우). 이 두 가지의 차이점과 권장 사용은 공식 문서를 참조하십시오. php.net Guides.codepath.com


4. PHP 8+ (또는 더 이상 사용되지 않은 기능을 피하고 싶다) - 권장 대안

새로운 프로젝트 또는 PHP 8+ 환경의 경우 MB_DETECT_ENCODING + MB_CONVERT_ENCODING / ICONV를 사용하거나 클라이언트가 UTF-8을 균일하게 사용할 수 있도록 권장됩니다 (모범 사례). 예:

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">normalize_cyrillic_url_param_modern</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-keyword">string</span></span></span><span> </span><span><span class="hljs-variable">$rawUrlPart</span></span><span>, </span><span><span class="hljs-keyword">array</span></span><span> </span><span><span class="hljs-variable">$tryEncodings</span></span><span> = [</span><span><span class="hljs-string">'Windows-1251'</span></span><span>,</span><span><span class="hljs-string">'KOI8-R'</span></span><span>,</span><span><span class="hljs-string">'CP866'</span></span><span>]) : </span><span><span class="hljs-title">string</span></span><span> {
    </span><span><span class="hljs-variable">$decoded</span></span><span> = </span><span><span class="hljs-title function_ invoke__">rawurldecode</span></span><span>(</span><span><span class="hljs-variable">$rawUrlPart</span></span><span>);
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">function_exists</span></span><span>(</span><span><span class="hljs-string">'mb_detect_encoding'</span></span><span>) &amp;&amp; </span><span><span class="hljs-title function_ invoke__">function_exists</span></span><span>(</span><span><span class="hljs-string">'mb_convert_encoding'</span></span><span>)) {
        </span><span><span class="hljs-comment">// 노력하다检测并转换到 UTF-8</span></span><span>
        </span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$tryEncodings</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$enc</span></span><span>) {
            </span><span><span class="hljs-comment">// 检测字节串是否~을 위한此编码(테스트는 신뢰할 수 없습니다,故采用노력하다转换后判断)</span></span><span>
            </span><span><span class="hljs-variable">$maybe</span></span><span> = @</span><span><span class="hljs-title function_ invoke__">mb_convert_encoding</span></span><span>(</span><span><span class="hljs-variable">$decoded</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>, </span><span><span class="hljs-variable">$enc</span></span><span>);
            </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$maybe</span></span><span> !== </span><span><span class="hljs-literal">false</span></span><span>) {
                </span><span><span class="hljs-comment">// 간단한 검증:변환 후 원래 바이트 길이와 비슷합니까?(아니요 100% 믿을 수 있는,그러나 실용적)</span></span><span>
                </span><span><span class="hljs-variable">$back</span></span><span> = @</span><span><span class="hljs-title function_ invoke__">mb_convert_encoding</span></span><span>(</span><span><span class="hljs-variable">$maybe</span></span><span>, </span><span><span class="hljs-variable">$enc</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>);
                </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$back</span></span><span> !== </span><span><span class="hljs-literal">false</span></span><span> &amp;&amp; </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$back</span></span><span>) &gt;= </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$decoded</span></span><span>) - </span><span><span class="hljs-number">2</span></span><span>) {
                    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$maybe</span></span><span>;
                }
            }
        }
    }
    </span><span><span class="hljs-comment">// 最后退回원래의解码后的끈(아마 이미 UTF-8)</span></span><span>
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$decoded</span></span><span>;
}
</span></span>

또한, 성숙한 타사 라이브러리 (예 : Voku/Portable-UTF8 등)를 사용하여 복잡한 코딩/정규화 문제, 특히 높은 견고성이 필요한 생산 시스템에서 처리 할 수 ​​있습니다. github


5. 실제 제안 및 핵심 요점 목록

  1. 우선 순위 : 가장 좋은 솔루션은 모든 고객이 UTF-8을 균일하게 사용할 수 있도록하는 것입니다 (HTML <Meta charset = "UTF-8"> , HTTP 헤더, API 문서에 설명). 이것은 기본적으로 차량 코드를 피하기위한 모범 사례입니다.

  2. 기능 선택 : URL 인코딩을 수신 할 때 쿼리 파트 ( ? a = b + c ) 인 경우 urldecode ()는 +를 공간으로 바꿉니다. 경로 세그먼트 인 경우 rawurldecode ()가 선호됩니다. php.net +1

  3. 서버 측 변환 : 히스토리 데이터 또는 타사 시스템 만 처리 할 수있는 경우 바이트 시퀀스는 위에 표시된 변환 체인을 사용하여 UTF-8로 변환됩니다 ( rawurldecodeconver_cyr_string (사용 가능한 경우) 또는 MB_CONVERT_ENCODING / ICONV ). php.net +1

  4. 감지 및 폴백 : 자동 감지 인코딩은 100% 정확하지 않습니다. 주요 시나리오에 "신뢰성"판단을 추가하는 것이 좋습니다 (예 : 탐지 후 일관성 확인 및 역전 변환 확인) 및 수동 중재에 대한 실패를 기록하거나 특정 규칙을 추가하는 것이 좋습니다.

  5. 감가 상각 참고 : Convert_Cyr_String은 PHP 7.4에서 더 이상 사용되지 않은 것으로 표시되어 PHP 8.0에서 제거됩니다. 코드가 최신 PHP 환경에서 오랫동안 실행되어야하는 경우 호환 가능한 대안 ( MB_CONVERT_ENCODING / ICONV / THIRDPARTY 라이브러리)을 구현하십시오. php.net


6. 빠른 비교 예제 (양쪽 끝 호환)

시나리오 A : 레거시 클라이언트는 KOI8-R과 함께 매개 변수 (쿼리)를 보냅니다. 서버는 UTF-8을 얻기를 희망합니다.

 <span><span><span class="hljs-variable">$raw</span></span><span> = </span><span><span class="hljs-variable">$_GET</span></span><span>[</span><span><span class="hljs-string">'q'</span></span><span>];                </span><span><span class="hljs-comment">// 원래의 %xx 끈</span></span><span>
</span><span><span class="hljs-variable">$bytes</span></span><span> = </span><span><span class="hljs-title function_ invoke__">rawurldecode</span></span><span>(</span><span><span class="hljs-variable">$raw</span></span><span>);      </span><span><span class="hljs-comment">// 이진 바이트를 얻습니다</span></span><span>
</span><span><span class="hljs-comment">// 若사용 가능 convert_cyr_string:</span></span><span>
</span><span><span class="hljs-variable">$win</span></span><span> = </span><span><span class="hljs-title function_ invoke__">convert_cyr_string</span></span><span>(</span><span><span class="hljs-variable">$bytes</span></span><span>, </span><span><span class="hljs-string">'k'</span></span><span>, </span><span><span class="hljs-string">'w'</span></span><span>); </span><span><span class="hljs-comment">// koi8-r -&gt; windows-1251</span></span><span>
</span><span><span class="hljs-variable">$utf8</span></span><span> = </span><span><span class="hljs-title function_ invoke__">mb_convert_encoding</span></span><span>(</span><span><span class="hljs-variable">$win</span></span><span>, </span><span><span class="hljs-string">'UTF-8'</span></span><span>, </span><span><span class="hljs-string">'Windows-1251'</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$utf8</span></span><span>;
</span></span>

시나리오 B : PHP 8+ 환경에서는 최신 방법을 사용하여 자동 변환을 시도해보십시오.

 <span><span><span class="hljs-variable">$raw</span></span><span> = </span><span><span class="hljs-variable">$_GET</span></span><span>[</span><span><span class="hljs-string">'q'</span></span><span>];
</span><span><span class="hljs-variable">$bytes</span></span><span> = </span><span><span class="hljs-title function_ invoke__">rawurldecode</span></span><span>(</span><span><span class="hljs-variable">$raw</span></span><span>);
</span><span><span class="hljs-variable">$utf8</span></span><span> = </span><span><span class="hljs-title function_ invoke__">normalize_cyrillic_url_param_modern</span></span><span>(</span><span><span class="hljs-variable">$raw</span></span><span>, [</span><span><span class="hljs-string">'Windows-1251'</span></span><span>,</span><span><span class="hljs-string">'KOI8-R'</span></span><span>,</span><span><span class="hljs-string">'CP866'</span></span><span>]);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$utf8</span></span><span>;
</span></span>

7. 결론 (핵심 요점 검토)

  • Convert_cyr_string은 한때 키릴 단일 바이트 인코딩 사이의 교환을 처리하는 편리한 기능이었으며, 지원되는 코드에는 K, W, I, A, D, M이 포함됩니다. 그러나이 함수는 PHP 7.4에서 더 이상 사용되지 않고 PHP 8.0에서 제거됩니다. 새로운 프로젝트는 대신 MB_CONVERT_ENCODING / ICONV 또는 타사 라이브러리를 사용하는 것이 좋습니다. php.net

  • Barbled URL 매개 변수의 문제에 직면 한 키는 다음과 같습니다. 먼저 백분율 부호 ( rawurldecode / urldecode )를 올바르게 디코딩 한 다음 실제 소스 인코딩을 기반으로 바이트 시퀀스를 UTF-8로 변환합니다. 경로 및 쿼리의 디코딩 기능을 선택할 때는 둘 사이의 처리 공간 ( + )의 차이점에주의를 기울입니다. php.net +1

  • 가장 안전한 장기 전략은 UTF-8을 통합 방식으로 사용하고 인터페이스 문서 및 클라이언트 구현의 코딩 사양에 명확하게 동의하는 것입니다. 역사적 또는 타사 데이터가 필요한 경우, 위의 전환 체인이 채택되고 감지 및 폴백 메커니즘이 추가되어 견고성을 보장합니다. github php.net

  • 관련 태그:

    URL