PHP가 정확히 유니 코드를 완전히 지원할 수없는 이유는 무엇입니까?


18

PHP는 유니 코드에 문제가 있다는 것을 모두 알고 있습니다. 유니 코드 구현 문제로 인해 버전 6이 효과적으로 버려졌습니다. 그러나 정확한 이유 가 무엇인지 아는 사람이 있는지 궁금합니다 . 건축 / 디자인 문제, 성능 문제, 커뮤니티 문제 (내가 아닌), 다른 것?

답변:


16

언어로서의 PHP는 분명히 그것을 가질 수 있지만 문제는 기존 프로그램과의 호환성에 있다고 생각합니다. 유니 코드 지원은 미묘한 방식으로 중단시킬 수 있으며 가장 귀찮은 종류의 버그입니다.

현재 PHP에서 대부분의 문자열 처리 기능은 "이진 안전 (binary-safe)"기능이므로 이미지 데이터와 같은 이진 형식뿐만 아니라 모든 인코딩의 파일을 처리하는 데 사용할 수 있습니다.

유니 코드 문자열을 추가하면 유니 코드 문자열과 이진 문자열을 혼합하지 않도록 매우 조심해야합니다 (문자열이 다른 소스에서 왔으며 전에는 걱정할 필요가 없었습니다). 그리고 더 이상 인코딩에 대해 무지 할 수 없었습니다 (그리고 많은 스크립트가 이것에 대해 무지합니다!)

또 다른 어렵지만 해결 가능한 문제는 유니 코드 문자열의 임의 액세스입니다. $string[$offset]사소한 것에서 매우 느리거나 약간 느리고 매우 복잡한 변경의 구현 .

또한 PHP의 내부 인코딩으로 UTF-16을 선택하는 것은 실수라고 생각합니다. UTF-8 (대리 쌍으로 인한 가변 너비) 및 UCS-2의 비효율 성과 같은 문제가 있습니다. 어쩌면 그들은 그것을 폐기하고 UTF-8로 다시 시작해야합니까?

</speculation>


2
utf8로 전환하는 것에 전적으로 동의합니다.
GrandmasterB

UTF-16이 데이터 청크 크기를 제외하고 UTF-8보다 더 나쁘다고 생각하십니까?
ts01

3
@ Dean Harding : UTF-16으로 전혀 작업 할 수 없으며 랜덤 액세스 ( O (1) ) 만 불가능하다는 말은 아닙니다. UTF-16은 100 번째 코드 포인트가 200 번째 바이트에서 시작한다는 것을 보증하지 않으므로 100 번째 코드 포인트에 액세스하려면 이전의 모든 코드 포인트를 선형으로 스캔해야합니다. 이와 관련하여 UTF-8과 비슷합니다 (즉, n 번째 문자 / 코드 포인트에 대한 액세스는 O (1)이 아니라 O ( n )입니다 ).
Kornel

1
@Dean : UTF-16과 UTF-8 사이의 데이터 정렬 또는 변환과 같은 것은 대리 문자에서 문자 결합과 동일 하게 작동 하지 않습니다 .
dan04

3
UTF-16 (또는 다른 인코딩)보다 UTF-8을 선택한 이유에 대한 훌륭한 요약은 utf8everywhere.org 에서 찾을 수 있습니다 .
Joachim Sauer

11

TLDR : 많은 PHP 라이브러리는 유니 코드를 지원하지 않거나 서로 호환되지 않는 방식으로 지원하는 네이티브 C 라이브러리보다 얇은 계층입니다. 이 상황을 수정하면 이전 버전과 호환되지 않는 변경 사항이 발생할 수 있습니다.

면책 조항 : 몇 년 전에 PHP에서 Python으로 (돌아 보지 않기 위해) 전환 한 내 의견은 분명히 편향되어 있습니다.

PHP는 훌륭하고 영리한 해킹이라고 생각합니다. 해킹으로서, 그것은 소박하게 시작되었고 컴퓨터 언어 이론 관점에서 잘 생각되고 통합 된 디자인이 부족한 많은 희소 한 라이브러리에서 다소 혼란에 빠졌습니다.

Machiavelli가 말했듯이, "자기 기초를 처음으로 세우지 않은 사람은 나중에 그 기초를 놓을 수있는 능력이있을 수 있지만 건축가에게는 문제가되고 건물에 위험이있을 수 있습니다".

프로그래밍 언어의 경우 인기가 높을수록 변경하기가 더 어렵습니다. 그래서 C와 같은 언어는 10 년마다 한 번씩 변경됩니다. 예를 들어, Python 3은 이전 버전과 호환되지 않는 많은 변경 사항을 만들었지 만 그다지 좋지 않았습니다. 이전 파이썬 화신에서 유니 코드 지원은 이미 PHP의 현재 상태보다 우수하다고 간주되었지만 파이썬 3의 가장 극심한 변화는 유니 코드 처리와 관련이 있습니다. 이 호언 장담 에서 아르 민 Ronacher는 파이썬 지역 사회의 거대한 공유에서 좌절을 요약 한 것입니다.

"유비쿼터스 웹 플랫폼 인 PHP"는 자체 성공의 대상이됩니다. PHP에서 유니 코드를 통합적으로 지원하는 것은 불가피하지만 많은 피, 땀, 눈물이 필요합니다.


글쎄, 모두가 여기에 동의한다고 생각합니다. 그러나 나는 세부 사항을 요구했다;)
ts01

3
문제는 많은 기본 라이브러리가 유니 코드를 잘 처리하지 못하므로 처음부터 시작하지 않고 문제를 해결하기가 매우 어렵다는 것입니다.
Paulo Scardine

(fyi, "몇 년 전부터"PHP가 좋아지고 파이썬이 나빠
졌습니다

1
@ZJE : 감사합니다. 이 변경 사항에 대한 참조 자료를 알려 주시겠습니까?
Paulo Scardine

6

오래된 PHP 6 작업이 중단 된 주요 이유 중 하나는 내부 복잡성 및 수행해야 할 작업량 때문이었습니다.

약간의 역사 : PHP 6의 유니 코드 구현은 더 큰 PHP 사용자의 요구에 의해 설계되었으며 유니 코드 "올바른"작업을 시도했습니다. 일부 평가 후, PHP의 유니 코드 지원의 기본 설계자는 내부적으로 Utf-16 인 새로운 문자열 유형을 추가하고 다른 위치에서 다른 엔딩을 사용할 수 있도록 선택했습니다. 따라서 코드는 하나의 인코딩으로 작성 될 수 있으며 출력은 다른 인코딩을 사용하고 다른 인코딩을 "runtme 작업"할 수 있습니다. UTF-16을 선택하는 이유는 작업이 UTF-16을 사용하는 ICU 라이브러리를 기반으로해야하기 때문에이 인코딩은 일반적인 문자열 작업을 빠르게 수행하지만 utf-와 utf-16 사이의 대화는 비교적 저렴하다는 것이 밝혀졌습니다 . 여태까지는 그런대로 잘됐다.

이제이 작업의 결과는 무엇보다도 새로운 문자열 유형의 도입입니다. 그때까지 PHP의 내부 유형 시스템에는 몇 가지 유형 (NULL, bool, int / long, float / double, string, array, resource, object)이 있었고 많은 코드 가이 경우에 대한 가정을했습니다. 이러한 가정 외에도 문자열에서 작동하는 모든 함수와 그 중 많은 함수가 개별적으로 평가되어야하며 인코딩 처리 방법을 결정해야합니다. 바이너리 문자열이나 유니 코드 문자열에서 작동해야합니까? 어떤 인코딩을 사용해야하는 등의 변환이 필요한 경우 이것은 많은 작업이며 경우에 따라 올바르게 수행하기가 매우 복잡합니다. 또한 PHP의 대부분의 주요 API는 이진 문자열 버전 (이전 버전)과 종종 "런타임 인코딩"문자열 버전을 가지므로 내부 API는 상당히 복잡해졌습니다.

그렇게하는 과정에서 많은 개발자들이 공 생성을 극복하고 utf-16에 짜증을 냈으며 메모리 사용량이 두 배 이상 증가하고 문자열을 변환하는 데 많은 시간을 소비하면서 기존 애플리케이션을 대부분 중단한다는 사실을 좋아하지 않았습니다. 그래서 PHP는 자원 봉사자들에 의해 주도되었고, 점점 더 적은 수의 개발자들이 작업하고 있었고 다른 것들이 쌓여서 기고자들은 불행 해졌고 결국 포기해야했습니다.

이제 미래에는 무엇을 가져올 수 있습니까? -PHP ae에서 점점 더 많은 것들이 utf-8을 중심으로 빌드되는 느린 발전이 있습니다. 커스텀 타입을 강하게 사용하지 않고 모든 것을 강요하지 않으며 현재 개발자는이 뜨거운 다리미에 닿지 않습니다. 누군가는 그것이 잘 작동하도록 좋은 제안을 할 수 있기를 희망하지만, 현재 "모두"는 그 단어 만 들으면 도망 갈 것입니다. :)


1

실제 이유는 PHP 개발 팀에 PHP 개발을위한 명확한 로드맵이 없기 때문입니다. 나는이 언어를 매우 좋아하지만 언어가 개발되는 방식에 따라 조금 걱정이됩니다.


2
저는 5 년 동안 파이썬을 사용하여 5 년 동안 파이썬을 사용했습니다. 파이썬은 놀라운 개발 과정과 훌륭한 리더십을 가지고 있습니다. 주요 과제는 올바른 웹 프레임 워크를 찾는 것입니다. 우리는 우리 자신의 AppStruct를 굴 렸습니다.
gahooa

1
PHP 6에 대한 로드맵이있었습니다. 도움이되지 않았습니다.;) 로드맵 문제 중 하나는 PHP가 등장하는 자원 봉사자들에 의해 운영된다는 것입니다. 갑자기 사라짐 (결혼, 직업 변경 등)
johannes

행복하게 PHP 7은 성공입니다.
danger89

5 년 후 여전히 완전한 유니 코드를 지원하지 않는 :)
Mchl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.