2011-01-18 8 views
0

데비안 서버의 PHP에서 UTF-8 문자열에 문제가 있습니다. 세부Debian 서버의 PHP DOM에 대한 UTF-8 문제

업데이트

I've은 좀 더 테스트를 할 상황은 이제 더 구체적이다. 상황에 더 잘 부합하도록 제목과 세부 정보를 업데이트했습니다. 답변을 주셔서 감사 드리며 문제가 명확하게 설명되지 않았 음을 사과드립니다. 다음 스크립트는 내 데비안 서버에 내 로컬 Windows 시스템에서 잘 작동하지만 내 서버에서

UTF-8: ÄÖÜ 
UTF-8: ÄÖÜ 

출력은 다음과 같습니다 :

내 로컬 컴퓨터에서 예상 출력이므로

<?php 
header("Content-Type: text/html; charset=UTF-8"); 
$string = '<html><head></head><body>UTF-8: ÄÖÜ<br /></body</html>'; 
$document = new DOMDocument(); 
@$document->loadHTML($string); 
echo $document->saveHTML(); 
echo $string; 

UTF-8: ÄÖÜ 
UTF-8: ÄÖÜ 

BOM이없는 UTF-8로 메모장 ++에서 스크립트를 작성하고 SSH를 통해 전송했습니다. 귀도 (guido)가 알려준 것처럼 문자열 자체는 적절하게 UTF-8로 인코딩됩니다. PHP DOM 또는 libxml에 문제가있는 것 같습니다. 그리고 그 이유는 그것이 기계에 의존하기 때문에 약간의 설정이되어야합니다.

원래의 질문에

내가 Windows에서 XAMPP 로컬로 작업하고 모든 것이 괜찮습니다. 하지만 서버에서 UTF-8 문자열을 사용하여 프로젝트를 배포하면 모두 엉망이됩니다. 사실이 테스트 스크립트를 업로드 할 때

echo utf8_encode('UTF-8 test: ÄÖÜ'); 

나는 "ÃÃ"를 얻습니다. 또한 내가 서버에 퍼티와 연결할 때 움라우트 (ÄÖÜ)를 쉘에 올바르게 쓸 수 없다. 이 문제가 PHP와 관련이 있는지 궁금합니다.

답변

0

문제의 원인은 서버에 이전 버전의 libxml (2.6.32)이었습니다. 개발 기계에서는 2.7.3이었습니다. 불안정한 패키지로 libxml을 업그레이드하여 2.7.8 버전을 만들었습니다. 문제는 이제 사라졌습니다.

+0

질문의 잘못된 범위와 최종 답변에 대해 유감스럽게 생각합니다. 특히 힌트에 대해 귀도에게 특히 감사드립니다.불행히도이 문제는 libxml과 관련이 있습니다. –

2

아파치의 AddDefaultCharset 설정을 확인하십시오.

표준 debian apache 배포에서 설정은 /etc/apache2/conf.d/charset에서 수정할 수 있습니다.

+0

이미 확인되었습니다. 아무 것도 없다. 그러나 응답은'text/html; charset = utf-8' –

+0

시도해보십시오. 불행히도 그것은 문제를 해결하지 못합니다. –

1

파일이 로컬 컴퓨터에서와 동일한 바이트 - 바이트인지 확인하십시오. 텍스트 모드에서의 FTP 전송은 엉망으로 만들 수 있습니다. 바이너리를 사용해 볼 수도 있습니다.

+0

전송은 SVN (커밋 및 서버 측 내보내기)입니다. 나는 그것이 byte-to-byte이어야한다고 생각한다. 또는 SVN 아무것도 위로 엉망이 될 수 있을까? –

+0

가능성은 낮지 만 여전히 가치가 있습니다. – BarsMonster

+0

guido에게 나는 퍼티에서 SVN 스크립트를 호출하여 프로젝트를 SVN에서 웹 디렉토리로 배포합니다. 내 로캘 또는 연결 설정 (엉망이 될 수 있음)이 SVN 내보내기에 영향을 줄 수 있습니까? –

0

php.ini 파일에서 서버의 만들면 기본적 캐릭터 세트를 변경해보십시오 : = "UTF-8"또한

만들

default_charset 당신이 UTF-으로 적절한 콘텐츠 형식 헤더를 발송하고 있는지 확인 8

php mbstring 모듈을 적절하게 구성하고 mbstring 기능을 사용하고 데이터베이스 연결이 utf-8을 사용하고 있는지 확인하면 아무런 문제가 발생하지 않습니다.

DB를 일부

은 쿼리 "SET 명칭 'UTF8'"나는 보통 버퍼를 처리 할 수 ​​mbstring 사용하여 출력 버퍼를 시작

와 mysql을 위해 수행 할 수 있습니다. 이것은 프로덕션 웹 사이트에서 사용하는 것이며 매우 견고한 접근 방법입니다. 그런 다음 콘텐츠 렌더링이 끝나면 버퍼를 보냅니다.

sampe 코드를 원하면 알려주십시오.

또 다른 쉬운 속임수는 잘못된 헤더가 php 또는 웹 서버에 의해 발송되는지 아닌지를 브라우저에서보기 -> 인코딩 메뉴를 사용하여 utf-8인지 확인하는 것입니다. 그렇지 않고 utf-8로 전환하면 모든 것이 정상적으로 보입니다. 그러면 헤더 나 컨텐츠 유형에 문제가있는 것입니다. 이미 utf-8이고 텍스트가 엉망이라면 코드 나 db 연결에서 잘못 될 수 있습니다. mysql을 사용하고 있다면 관련된 테이블과 컬럼도 utf-8

0

명시 적으로 content-type 헤더를 보내고 있습니까? 이것을 생략하면 아파치가 당신을 위해 보내는 것 같다. 파일이 Latin-1 인코딩 (Apache에 의한)으로 제공되고 브라우저가 그 파일을 읽으면 UTF-8 문자의 형식이 잘못됩니다.

이 시도 : 다음

<?php 
echo "Drop some UTF-8 characters here."; 

을 : 두 번째 일을해야

<?php 
header("Content-Type: text/html; charset=UTF-8"); 
echo "Drop some UTF-8 characters here."; 

, 첫 번째는하지 않습니다. 파일을 UTF-8 인코딩 파일로 저장하는 것이 좋습니다 (아직없는 경우).

데이터베이스 문자가 엉망인 경우 (SQL) 연결 인코딩을 설정해보십시오.

+0

Content-Type 헤더는'text/html; charset = utf-8' –

1

편집 : 업데이트 된 질문에 대한 답 :

 
<?php 
header("Content-Type: text/html; charset=UTF-8"); 
$string = '<html><head>' 
.'<meta http-equiv="content-type" content="text/html; charset=utf-8">' 
.'</head><body>UTF-8: ÄÖÜ<br /></body</html>'; 
$document = new DOMDocument(); 
@$document->loadHTML($string); 
echo $document->saveHTML(); 
echo $string; 
?> 

나는 당신의 입력 문자열이 이미 UTF-8이 될 수있다 생각한다. 시도 :

 
setlocale(LC_CTYPE, 'de_DE.UTF-8'); 
$s = "UTF-8 test: ÄÖÜ"; 
if (mb_detect_encoding($s, "UTF-8") == "UTF-8") { 
    echo "No need to encode"; 
} else { 
    $s = utf8_encode($s); 
    echo "Encoded string $s"; 
} 
+0

"인코딩 할 필요가 없다"고하지만 setlocale (LC_CTYPE, 'de_DE.UTF-8');을 설정 한 후 테스트 스크립트 출력이 올바른 것입니다. 이 문제가 서버 문제입니까? 로케일을 일반적으로 UTF-8로 설정하려면 어떻게해야합니까? –

+0

@Alex Lawrence 만약 데비안 셸에서 스크립트를 편집했다면, 나이가 들어서야 리눅스에서 기본 UTF8 인코딩을 사용하기 때문에 UTF-8 문자를 입력 할 것입니다 (퍼티로 로깅을 확인하고 * echo $ LANG *). ; 나는 윈도우에 대해 모른다. 나는 여전히 CP-1252를 사용하고 있다고 생각한다. –

+0

$ LANG의 에코는'de_DE.UTF-8'이다. vim을 사용하는 방법을 모르므로 테스트 스크립트로 nano를 사용했습니다. 코드를 붙여 넣으면 문자가 나노에 제대로 표시되지 않지만 브라우저의 출력이 정확합니다. 문제가 무엇인지 알지 못합니다. PHP로 터미널과 UTF-8 문자열을 사용하여 프로젝트에서 SVN 내보내기를 수행 할 때마다 엉망이됩니다. :( –