내 스크립트에서 UTF-8 문자를 사용할 수 있습니다.
사실상변수와 함수 이름에 유니 코드 문자가 포함되어 있습니다..
또한mb_string 확장멀티 바이트 문자열을 취급하지만, 수많은 기사에서 PHP는 유니 코드 지원이 부족하여 비판을 받고 있습니다.
나는 그것을 얻지 않는다; PHP가 유니 코드를 지원하지 않는다고 말하는 이유는 무엇입니까?
PHP가 몇 년 전에 시작되었을 때, UTF-8은 실제로 지원되지 않았습니다. 우리는 Windows 98 / Me와 같은 비 유니 코드 OS가 현재 최신 상태 였고 델파이와 같은 다른 큰 언어도 비 유니 코드 였을 때를 이야기합니다. 모든 언어가 1 일부터 유니 코드를 염두에두고 설계된 것은 아니며, 많은 것을 깨뜨리지 않고 언어를 유니 코드로 완전히 변경하는 것은 어렵습니다. 델파이는 1 년 전만해도 유니 코드 호환이 가능했지만, Java 나 C #같은 다른 언어는 1 일째 유니 코드로 설계되었습니다.
따라서 PHP가 성장하여 PHP 3, PHP 4 및 현재 PHP 5가되었을 때, 아무도 유니 코드를 추가하기로 결정하지 않았습니다. 왜? 아마도 기존 스크립트와 호환되거나 utf8_de / encode 및 mb_string이 이미 존재하고 작동하기 때문일 수 있습니다. 나는 확실히 모른다. 그러나 나는 그것이 유기적 인 성장과 관련이 있다고 강력하게 믿는다. 기능은 기본적으로 존재하지 않고 누군가가 작성해야하며 단순히 PHP에서는 아직 발생하지 않았습니다.
편집 : 좋아, 나는 질문을 잘못 읽었습니다. 문제는 문자열이 내부적으로 어떻게 저장 되는가입니다. "Währung"또는 "Écriture"를 입력하면 인코딩이 사용 된 바이트를 만드는 데 사용됩니까? PHP의 경우 코드 페이지가있는 ASCII입니다. 즉, ISO-8859-15를 사용하여 문자열을 인코딩하고 일부 중국어 코드 페이지로 디코딩하면 이상한 결과가 나타납니다. 대안은 C #또는 Java와 같은 언어로, 모든 것이 유니 코드로 저장됩니다. 즉, 더 이상 코드 페이지가 없으므로 이론적으로 엉망이 될 수 없습니다. 나는 추천한다.조엘의 기사유니 코드와 문자 세트에 관한 것이지만, 본질적으로 다음과 같이 요약 할 수 있습니다. 문자열은 내부적으로 어떻게 저장되며 PHP로 대답하는 것은 "유니 코드가 아닙니다"입니다. 즉, 항상 문자열을 처리 할 때 매우주의 깊고 명시 적이어야합니다 입력, 저장 (데이터베이스) 및 출력 중에 문자열을 적절한 인코딩으로 유지하십시오. 이는 매우 오류입니다.
나는 그것이 기술적 어려움이 아니라 문화적 어려움이라고 생각한다.
기술적 인 문제에 대해서는 --- 한 문자가 1 바이트라는 가정하에 구축 된 생태계에서 유니 코드를 구현하는 데 전혀 문제가 없다. --- 개발자는 자바 나 파이썬의 노력 대부분을 복사 할 수 있었다. 2001 년경부터 괜찮은 유니 코드 호환성을 유지하면서).
내가 읽을 때PHP에 대한 공식, 현재 문서에 첨부 된 토론 스레드utf8_encode()
기능, 나는 현기증의 감각을 얻는다.
firstoff, 그 함수는 호출됩니다.utf8_encode()
; 그러나 문서에 명시된 문자열은 ISO-8859-1 (a.k.a. latin-1)에 있어야합니다. 그것은 sooo php입니다. sooo 80입니다.
대부분의 의견 제시자는 유니 코드를 부담으로 인식하는 것 같습니다. 문자열을 '알 수없는 컨텐트로 변환하는 방법', '인코딩이 혼합 된 s'strings을 처리하는 방법 (wtf?), 또는 일반적으로 함수의 4 바이트를 초과하는 코드 포인트를 처리하는 방법이 많이 있습니다. 코드 포인트 제한.
토론은 squiggles 없애거나 그 함수의 행동의 문제가되는 부분을 피하기 위해 픽스 업을 중심으로 이루어집니다. 나에게 sooo php이다 : 모두가 단지 수정을하고 있으며, 근본적으로 올바른 방법으로 구현되는 것은 거의 없다. 당신이 이것을 내 편에 비방하는 것으로 생각한다면, 여기에 약간의 음식들이 있습니다 :
이 문서가 이미 UTF-8이면 독일어 Umlaute [äöü]를 깨뜨릴 수 있습니다.
(utf-8이 두 번 적용될 때 작동하지 않는다는 것을 이해하지 못함)
8859에서 두드러진 1252를 UTF8로 변환 할 수있는 iconv () 함수를 살펴보십시오.
(좋은 지적 : 일부 PHP 개발자의 선행 기술 무시, 대신 버그 자체 구현)
preg_match를 사용하여 utf8_encode가 필요한지 여부를 탐지 [...] 대리권 제외 [...]
(문자열에서 문제가되는 모든 내용을 자동으로 지우고 중단되지 않는 내용 만 남기고 제안합니다.utf8_encode()
; 이것은 텍스트를 읽을 수 없도록 만들거나 (또는 모두 사라지게 할 수도 있지만, 더 이상 오류 메시지가 없습니다)
UTF-8이 아닌 경우에만 문자열을 인코딩합니다. [...]
mb_detect_encoding($s, "UTF-8")
(지적 된 바와 같이다른 주석 작성자가, 이것은 작동하지 않을 것입니다 :
$str = 'áéóú'; // ISO-8859-1
mb_detect_encoding($str, 'UTF-8'); // 'UTF-8'
mb_detect_encoding($str, 'UTF-8', true); // false
그래서 여기에 우리는 하나의 버그가 다른 것으로 대체되는 것을보고 있습니다. 행복한 사냥. 또한, 그들이 제안한 것처럼 보이는 것은 휴리스틱 (느리고 불확실한) 수단을 사용하여 기계적 (신속하고 확실한) 수단으로 해결할 수있는 수단을 사용하여 문제를 해결하는 것입니다)
utf8_ [encode | decode]는 실제로 문서에서 말한 것처럼 ISO-8859-1 에서뿐만 아니라 Windows-1252 문자도 변환합니다.
(공식 PHP 문서에 의존해서는 안되며 수년간의 경험을 통해 항상 아무도 그 문서를 되 먹지 않을 것이다)
나는 is_utf8 함수에서 일하고 있었고 여기에 게시하고 싶었고, 다른 사람들과 함께 5000 char 버그도 고려했다.
(유니 코드가 제대로 구현되지 않았기 때문에 주로 발생하는 문제에 대한 픽스입니다.utf8_encode()
함수는 코드 포인트 당 4 바이트를 넘기 때문에 결과 (또는 출력?) 텍스트가 5000자를 초과하면 중단됩니다.
나는 이것 같이 계속해서 갈 수 있었다. 당신은 이미 아이디어를 얻었습니다. PHP 커뮤니티는 인코딩과 캐릭터 세트가 무엇인지 파악하고, 일반적인 인프라를 구축하기 위해 무엇이 필요한지, 특히 적절한 방식으로 유니 코드를 구현하십시오. 대신에, 그들은 비계와 판지, 손톱과 망치를 사용하고 PHP라고하는이 대 건축물을 짓고 다른 손톱으로 풀어 낼 수없는 모든 문제에 덕트 테이프를 던집니다. 물론, 그 건물은 가끔 합법적이지만 예상치 못한 특성과 같이 부는 모든 바람에 시달릴 것입니다.
이 특별한 스레드가 8 년 동안 활성화되어 있다는 것을 알게되면 지금부터 8 년 후에 상황이 나아질 것이라는 확신을 심어줄 수 없습니다.
"멀티 바이트 문자"의 개념은 문제의 핵심입니다.
직접 말하면 멀티 바이트 문자가 포함 된 문자열을 올바르게 처리하려면 확장자를 사용해야합니다. 익숙한 "정상적인"확장 기능 대신 확장 기능을 사용하는 것을 잊어 버리면 데이터가 절단됩니다. 확장 기능을 사방에 사용하도록 업데이트되지 않은 타사 라이브러리를 사용하는 경우에도 마찬가지입니다.
또한,매우 인기있는 인코딩여전히 명시 적이다.아니PHP에서 지원합니다. 아마도 그렇게 할 수없고 하위 호환성을 유지할 수 없기 때문입니다.
많은 일반적인 확장 기능에는 유니 코드 지원이 없거나 문자열에 유니 코드 / UTF-8 시퀀스 (예 : XMLReader)가 포함되어 있는지 "알아야하는"경우가 있습니다. 그리고 그것은 PHP의 glob ()가 FindFirstFileA 나 FindFirstFileW를 win32에서 호출 할 때 상당한 차이를 만들 수 있습니다.
또 다른 (훨씬 작지만 놀랍게도 종종 성가심의 원인이 됨) 문제는 PHP가 인식하지 못하는 BOM입니다.
많은 문자열 함수는 모든 것을 바이트 시퀀스로 취급하는 C 라이브러리에 해당하는 단순한 래퍼입니다. 또 다른 이유는 PHP가 불필요한 이전 버전과의 호환성을 지니고 있기 때문에 3 및 4의 잘못된 설계 결정으로 인해 고생하게됩니다.
어쩌면 5.3의 네임 스페이스를 사용하면 마침내 이전 함수를 단계적으로 제거 할 수 있습니다.
'지원'이란 의미는 '기본 지원'입니다. 보세요이자세한 정보를 얻으려면.