2012-01-22 3 views
2

나는 CLEditor richtext control과 함께 PHP 웹 사이트를 운영하고 있습니다. Euros와 British Pounds를 데이터베이스에 쓰려고 할 때, 캐릭터 세트는 포함 된 페이지 HTML, richtext control IFRAME HTML 및 MySQL 테이블 데이터 정렬에서 UTF-8로 설정되어 있기 때문에 문자는 정상적으로 처리됩니다. 모든 것이 그 앞에 있습니다. 내가 smart quotes를 작성하려고 할 때 그러나, 나는 데이터베이스에이 출력을보고 결국 :PHP와 MySQL을 사용하면 데이터베이스에 스마트 쿼트를 올바르게 작성하는 방법은 무엇입니까?

This is a “testâ€. 

(즉 제대로 브라우저에서 이상 표시하지 않는 경우, 테스트 단어가 라틴어 유사한 무언가가, 유로 기호 및 단어 앞의 작은 AE 기호와 그 뒤에는 라틴어 a와 유로 기호가 표시됩니다.)

PHP를 사용하여 해당 값을 데이터베이스에서 다시 읽어 페이지에 표시 할 때 , 그것은 다른 라틴 문자뿐만 아니라 그들에 물음표와 함께 검은 다이아몬드로 끝납니다.

해결하려면 어떻게해야합니까?

답변

3

먼저, MySQL 테이블이 인코딩으로 UTF-8을 사용하고 있는지 확인하십시오. 이 경우, 그것은 다음과 같이 표시됩니다

mysql> SHOW CREATE TABLE Users (
... 
) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8 | 

다음으로, 반드시 당신의 HTML 페이지가 UTF-8을 표시하도록 설정되어 있는지 확인 :

<html> 
    <head> 
     <meta http-equiv="content-type" content="text/html;charset=UTF-8" /> 
    </head> 
    .... 
</html> 

그런 다음 그것을 작동합니다.


편집 : 나는 의도적으로 내가 이미 고려 된 생각했기 때문에, 데이터 정렬에 대해 이야기하지만, 모든 사람의 이익을 위해, 내가이 답변에 좀 더 추가 할 수 없습니다.

당신의 상태,

나는 MySQL의 테이블 정렬에 UTF-8로 설정 한 캐릭터 세트를 ... 있습니다.

테이블 정렬은 charset과 동일하지 않습니다.

데이터 정렬은 문자 세트를 다른 문자 세트로 자동 변환하려고 시도하는 것입니다. 문의 목적은입니다. 예를 들어, latin1의 charset이 있고 UTF-8의 데이터 정렬이있는 경우 SELECT * FROM foo WHERE bar like '% - %'; (UTF-8 U + 2014)를 L + 0151 또는 U + 2014와 일치하는 latin1의 charset이있는 테이블에 추가합니다. 당신이 UTF-8로 인코딩 된 웹 페이지에이 라틴 인코딩 된 문자 출력 인 경우에 이렇게 우연히

하지 ..., 다음과 같은 얻을 것이다 :

이것은 â € œtestâ €입니다.

정확하게 문제의 출력 인 것 같습니다. 여기에 복사 할 HTML이 있습니다 :

<?php 
$string = "This is a “test”."; 
?> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html;charset=utf8"/> 
    </head> 
    <body> 
     <p><?php echo $string; ?></p> 
    </body> 
</html> 

이 파일을 latin1에 저장했는지 확인하십시오.

테이블이이 쿼리 실행되도록 설정되어 문자셋을 확인하려면 : (당신이 여러 영어 이외의 언어를 사용하지 않는 한) 당신의 용도에

SELECT CCSA.character_set_name, TABLE_COLLATION FROM information_schema.`TABLES` T, 
     information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` CCSA 
WHERE CCSA.collation_name = T.table_collation 
    AND T.table_schema = "database" 
    AND T.table_name = "table"; 

적절한 결과 :

대한
+--------------------+-----------------+ 
| character_set_name | TABLE_COLLATION | 
+--------------------+-----------------+ 
| utf8    | utf8_general_ci | 
+--------------------+-----------------+ 

덕분에 upvotes ;-) 내가 여기에 대한 답을 찾을

+0

매우 지능적인 답변을 주셔서 감사합니다. 시어 도어 - 탁월한 답변으로 과거 PHP OOP 관련 질문에 많은 도움을 주셨습니다. 그러나 여기에 응답하려면 - 그곳에갔습니다. 이미 내 게시물에 언급했다. 대부분의 다른 UTF-8 도구는 이미 작동합니다. 그것은 펑키 한 행동을하는 똑똑한 따옴표입니다. – Volomike

+0

솔직히 내가 위를 시도했다고 말한 곳을 보지 못했습니다. 나는 그것을 다시 읽었지만 당신이 이것을 언급 한 곳을 여전히 볼 수 없다;/나는 당신에게 흔히있는 문제를 보여 주었다. 세 번째 단계는 입력 된 문자를 확인하는 것입니다. 하지만 네가 이미 그걸 생각하고 있다고 생각 했어. 내가 틀렸다고 생각해. –

+0

"데이터베이스에 유로화와 영국 파운드를 쓰려고하면 문자 집합이 포함 된 페이지 HTML, richtext control IFRAME HTML 및 MySQL 테이블 데이터 정렬에서 UTF-8로 설정되어 있기 때문에 문자는 정상적으로 처리됩니다 모든 것이 그 앞에있다. " – Volomike

-1

:

https://stackoverflow.com/a/1262210/105539

이것은 유로화와 영국 파운드 문자를 방해하지 않는 것으로 보입니다.

+0

이 질문은 귀하의 문제에 대한 매우 안전한 응답이라고 생각됩니다. 사용자가 © 또는 심지어 - 또는 -에 붙여 넣으면 어떻게됩니까? 귀하의 앱은 모든 종류의 맹 글씨를 표시합니다. PHP 문자열 함수에 의존하는 대신 입력과 출력을 올바르게 얻는 것이 가장 좋습니다. –

+0

방금 ​​그 문자를 사용해 보았습니다. 그들은 내가 생각해 낸 시스템에서 잘 작동합니다. HTML을 UTF-8로, 데이터베이스 테이블을 UTF-8로 가지고 있으며, 데이터에 대해 수행 할 수있는 유일한 작업은 stripslashes이며, 위의 예제 링크를 사용하여 MS chars에 대한 strstr을 실행하는 것입니다. – Volomike

0

내용이 인쇄되기 전에 PHP 파일의 맨 위에이 파일이 있는지 확인하십시오. latin_swedish_ci를 utf8로 인코딩 된 웹 사이트로 가져올 수 있으며 올바르게 인코딩됩니다.

header("Content-type: text/html;charset=UTF-8");

는 나는 또한 내 데이터베이스 연결 한 후이를 넣어

(확실하지이만큼 중요한 경우) :

은이 게시물에 건너 오는 다른 사람에 대한 가치가 무엇인지에 대한

mysql_query("SET NAMES 'utf8'");
mysql_query("SET CHARACTER SET 'utf8'");

0

, 내가 발견 mysqld 설정 라인을 추가하는 것 - mysql 서버에 접근 할 수 있고 변경이 가능하다면 - curly-quotes로 내 문제를 해결할 수있다.

http://dev.mysql.com/doc/refman/5.6/en/charset-server.html

# Force UTF8 Charset Encoding 
skip-character-set-client-handshake 
collation_server=utf8_unicode_ci 
character_set_server=utf8 

내가 PHP에서 호출되는 SQL을 (이 잘 나타난)을 두 번 확인하고, 수동 (미세 일) 내 GUI에서 곱슬 따옴표와 함께 삽입/업데이트 한 Statment을 실행했다, 하지만 웹 서버에서 여전히 다중 제어 문자를 데이터베이스에 삽입하고있었습니다.

mysql 서버 변수를 확인한 결과 latin1이 서버 및 데이터베이스 (테이블/열이 UTF8 인 경우에도)의 기본값임을 알게되었습니다. 위의 행을 추가하고 update 문을 발행 한 페이지를 새로 고치면 둥근 따옴표가 올바르게 삽입되었습니다. 나는 이것이 서버의 기본 charset 인 latin1과 웹 서버 mysql 라이브러리 핸드 쉐이크를 협상하는 것으로 생각할 수 있습니다.

관련 문제