2012-10-21 6 views
3

사이트 전송을 처리 중이며 그 과정에서 내 charset이 파열되었습니다. 처음에는 변경없이 모든 파일을 전송했으며 새 서버의 파일에 특수 문자로는 개의 아이콘이 나타났습니다. 브라우저의 문자 인코딩 (Chrome 및 FF)을 보면 UTF-8을 자동으로 감지 한 것으로 나타났습니다. 페이지의 메타 문자 세트는 ISO-8859-1로 설정됩니다. 사본은 여러 데이터베이스의 여러 테이블에서 가져옵니다 (묻지 않음).브라우저에서 'ISO-8859-1'을 메타 문자 세트로 사용하는 경우 UTF-8로 페이지가 감지되었습니다.

원본 사이트에 모두 표시되어야합니다. 새로운 사이트에서 <?> ... 나는 그것을 파고 들었고, 기본 charset = "UTF-8"을 php.ini에서 찾았습니다. 아무것도 설정하지 않았습니다. 이제 사이트의 대부분의 페이지가 잘 표시되고, 브라우저는 메타 문자 세트 태그를 인식합니다. 모두가 행복합니다. 즉, 루트가 아닌 폴더로 이동할 때까지.

이 폴더의 파일은 메타 문자 세트가 ISO-8859-1이지만 브라우저에 UTF-8로 읽으므로이 페이지에 <?>이 표시됩니다. 브라우저를 ISO-8859-1로 설정하면 잘 표시됩니다. 자동 감지는 UTF-8로 재설정합니다. 어떤 아이디어?

감사합니다.

업데이트 (아래 코멘트에서 추가) :

나는 martinstoeckli에서 권장하는대로 W3C checker을 통해 페이지를 실행, 그리고 메타 태그가 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/> 동안 HTTP의 콘텐츠 형식이 Content-Type: text/html; charset=utf-8 것을 나에게 알려줍니다 내게 충돌 문자 인코딩 선언 오류가 발생했습니다. 미친 짓은 UTF-8 선언이 어디에서 왔는지 알아낼 수 없다는 것입니다. 그것은 어디에도 없습니다. 어떤 파일에도 없습니다. 모든 파일은 UTF-8 w/out BOM으로 저장되었습니다. php.ini는 기본값을 선언하지 않도록 설정되어 있습니다. PatomaS가 제안한 것처럼 .htaccess 폴더가 설정됩니다.

(그것은 가치가 무엇인지, 모질라의 웹 스니퍼 text/html; charset=utf-8의 HTTP 헤더의 Content-Type을 확인하십시오.)

업데이트 : 나는 그것을 제기로 우리는이 문제에 대한 해결책에 도달하지 않았지만 , 내가 결정 했 내 문자 인코딩 문제를 해결하는 가장 좋은 방법은 UTF-8 인코딩을 사용하는 모든 것을 리펙토링하는 것입니다. 물론, 이것은 아마도 당신이 "나를 왜 utâ8-encode()하지 않겠습니까?"와 같은 흥미 진진한 초보자 질문으로 여기 나를 보게 될 것입니다. "

물론 미스테리가 남아 있다는 것을 의미합니다. 모든 것이 다르게 구성되었다고 표시 될 때 서버가 HTTP Content-Type charset 헤더를 UTF-8로 보내는 이유는 무엇입니까?

답변

4

파일에 BOM (Byte Order Mark)이있을 수 있습니다. 메모장 + +로 파일을 열고 코딩 메뉴를 확인하려면 테스트 옵션으로 ansi로 변환을 선택할 수도 있습니다.

모든 곳에서 utf-8을 사용하는 것이 내가 제안 할 수있는 더 나은 장기적 접근 방법입니다.

+0

나는 숭고한 텍스트 2를 사용하고, 모든 파일이 BOM없이 UTF-8로 저장됩니다. 장기적으로 모든 것을 UTF-8로 변환 할 계획입니다. 지금은 문자를 올바르게 표시해야하고 다음 단계를 수행해야합니다. 답변 주셔서 감사합니다! – somewhatsapient

+0

나는 이것을 알아 내려고 시도하는 것이 말과 바퀴를 장바구니에 넣고 왜 내가 어디로 가지 않는지 묻는 것과 같다. 이 문제를 특별히 해결하지는 않지만 (왜 서버가 비정상적인 HTTP charset 헤더를 보내는가?), 현명한 장기적인 해결책을 제안함으로써 잘못된 인코딩 관행의 큰 문제를 해결하기 때문에 이것을 대답으로 받아들입니다. – somewhatsapient

+0

여기에는 선언 문제에 대한 설명이 나와 있습니다. http://www.w3.org/International/questions/qa-html-encoding-declarations btw .htaccess charset solution과 http://www.justskins.com/forums/php4-에서 설명한 설명을 시도해 볼 수도 있습니다. 1-2-incorrect-7845.html, cys –

4

모든 종류의 인코딩 문제에 훌륭한 W3-checker이 있습니다.

+0

고맙습니다. 나는이 검사기를 통해 페이지를 돌렸고 HTTP Content-Type은'Content-Type : text/html; charset = utf-8'이고 메타 태그는''입니다. 인코딩 선언 ** 오류.미친 짓은 UTF-8 선언이 어디에서 왔는지 알아낼 수 없다는 것입니다. 그것은 어디에도 없습니다. 어떤 파일에도 없습니다. 모든 파일은 UTF-8 w/out BOM으로 저장되었습니다. php.ini는 기본값을 선언하지 않도록 설정되어 있습니다. PatomaS가 제안한 것처럼 .htaccess 폴더가 설정됩니다. 도와주세요! – somewhatsapient

+0

@somewhatsapient - 그러면 메타 태그의 페이지를 ISO-8859-1로 선언했지만 파일을 UTF-8로 저장하려고합니다. 이것은 작동하지 않습니다. ISO-8859-1을 원하면 편집자 (Sublime)에게 UTF-8 대신이 인코딩을 사용하도록 알려야합니다. UTF-8이되도록하려면 메타 태그에서 UTF-8로 선언해야합니다. 파일과 메타 태그의 인코딩이 일치해야합니다. – martinstoeckli

+0

나는 이것을 시도했지만 문제를 해결하지 못했다. 이것을 테스트하기 위해, 나는 선언을 사용하여 UTF-8로 저장 한 죽은 단순한 HTML 파일을 만들었고, 문제는 발생하지 않았다. 그러나 .php와 똑같은 파일을 저장하면 충돌하는 선언이 나타납니다. 다시 말하지만, 이것은이 폴더에서만 발생합니다. HTTP와 메타 _ _ 사이의 선언 충돌을 생성하는 PHP 파일을 다른 폴더로 이동하면 _ 메타 태그 만 사용하여 깔끔하게 선언합니다. – somewhatsapient

0

당신은 ISO-8859-1로 원하는 모든 파일을 루트 .htaccess이 설정할 수 있습니다

<FilesMatch "\.(htm|html|xhtml|xml|css|js|php)$"> 
    AddDefaultCharset iso-8859-1 
</FilesMatch> 

해당 서버 헤더가 인라인 헤더보다 우선 기억하십시오.

+0

나는 이것을 시도했지만 어떤 명백한 효과도 없다. 그래도 감사합니다! – somewhatsapient

4

PHP 5.6에는 UTF-8로 설정된 새로운 기본 charset 지시문이 제공됩니다.이 경우 latin1로 metatag에 제공된 페이지에 문제가있을 수 있으며 유효성 검사 서비스에서 충돌이 발생할 수 있으므로 ini_set ('default_charset ','iso-8859-1 ')를 스크립트에 추가하십시오. 그런 다음 폴더를 생성

<?php 
    $server_root = realpath($_SERVER["DOCUMENT_ROOT"]); 
    $config_serv = "$server_root/php/config.php"; 
    include("$config_serv"); 
?> 

의 index.php :

예 : 스크립트의 시작 부분에이 코드 조각을 latin1에하도록 코딩 할 각 PHP 파일에 그 넣어 작업을 수행하기위한

예 : config.php를

<?php 
    ########################################################################## 
    # Server Directive - Override default_charset utf-8 to latin1 in php.ini # 
    ########################################################################## 
    @ini_set('default_charset', 'ISO-8859-1'); 
?> 
0,123,516 루트 웹 사이트에서 "PHP"과의 config.php에이 코드 조각을 넣어

php.ini가 latin1 (ISO-8859-1)로 설정되어 있고 utf-8 (유니 코드) 페이지를 제공하려는 경우 iso-8859-1, utf- 8. 그 봐 :

예 : config.php를

<?php 
    ########################################################################## 
    # Server Directive - Override default_charset latin1 to utf-8 in php.ini # 
    ########################################################################## 
    @ini_set('default_charset', 'UTF-8'); 
?> 

을 난 당신이 내 대답이 도움이되기를 바랍니다, 나는 이런 식으로 내 문제를 해결! 파이어 폭스와 html/css 유효성 검사기에 문제가있어서 latin1이라는 페이지와 utf-8이라는 헤더를 주었다. 이 갈등이 해결되었습니다! 마침내 내 대답을 사용하여 해결했습니다.

0

아파치는 코드에서 지정하는 경우에도 charset을 기본값 (UTF-8)으로 설정할 수 있습니다.

이 옵션은 httpd.conf 파일에 있으며 AddDefaultCharset입니다. 코드가 세계를 지배하게하려면 주석을 달아야합니다.

내 문제가 해결되었습니다.

소스 : https://major.io/2007/11/15/change-the-default-apache-character-set/