[php] 물음표와 함께 작은 검은 색 다이아몬드를 보여주는 PHP 출력

데이터베이스 소스에서 가져 오는 PHP 프로그램을 작성 중입니다. 일부 varchar에는 물음표가있는 검은 색 다이아몬드로 표시되는 따옴표가 있습니다 ( , REPLACEMENT CHARACTER , Microsoft Word 텍스트에서 가정).

PHP를 사용하여 이러한 문자를 제거하려면 어떻게해야합니까?



답변

해당 문자 ( U + FFFD “REPLACEMENT CHARACTER”)가 표시되면 일반적으로 텍스트 자체가 단일 바이트 인코딩 형식으로 인코딩되지만 유니 코드 인코딩 (UTF8 또는 UTF16) 중 하나로 해석된다는 의미입니다.

만약 그것이 다른 방법이라면 (보통) 다음과 같이 보일 것입니다 : ä.

아마도 원래 인코딩은 Latin-1이라고도하는 ISO-8859-1 일 것입니다. 스크립트를 변경하지 않고도 확인할 수 있습니다. 브라우저는 다른 인코딩으로 페이지를 다시 해석 할 수있는 옵션을 제공합니다. Firefox에서는 “보기”-> “문자 인코딩”을 사용합니다.

브라우저가 올바른 인코딩을 사용하도록하려면 다음과 같은 HTTP 헤더를 추가하십시오.

header("Content-Type: text/html; charset=ISO-8859-1");

또는 메타 태그에 인코딩을 넣으십시오.

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">

또는 데이터베이스에서 다른 인코딩 (가급적이면 UTF-8)으로 읽거나 iconv().


답변

이것은 문자셋 문제입니다. 따라서 여러 수준에서 잘못되었을 수 있지만 데이터베이스의 문자열은 utf-8로 인코딩되어 있으며 iso-8859-1로 표시됩니다. 또는 그 반대입니다.

이 문제를 해결하는 적절한 방법은 문자 집합을 바로 잡는 것입니다. PHP를 사용하기 때문에 가장 간단한 전략은 애플리케이션 전체에서 iso-8859-1을 사용하는 것입니다. 이렇게하려면 다음을 확인해야합니다.

  • 모든 PHP 소스 파일은 iso-8859-1로 저장됩니다 (cp-1252와 혼동하지 마십시오).
  • 웹 서버는 다음을 사용하여 파일을 제공하도록 구성됩니다. charset=iso-8859-1
  • 또는을 사용하여 PHP 문서 내에서 웹 서버 설정을 재정의 할 수 있습니다 header.
  • 또한 동일한 내용을 지정하는 메타 태그를 HTML에 삽입 할 있지만 반드시 필요한 것은 아닙니다.
  • 당신은 할 수있다 또한 지정 accept-charset온 속성 <form>요소를.
  • 데이터베이스 테이블은 latin1로 인코딩하여 정의됩니다.
  • PHP와 데이터베이스 간의 데이터베이스 연결은 latin1로 설정됩니다.

데이터베이스에 이미 데이터가있는 경우 데이터가 이미 엉망이되었을 가능성이 있습니다. 아직 생산 단계에 있지 않은 경우 모두 지우고 다시 시작하십시오. 그렇지 않으면 데이터 정리를 수행해야합니다.

메타 태그에 대한 참고 사항 : 모두가 그것이 무엇인지 오해하기 때문입니다.

웹 서버가 파일 (HTML 문서)을 제공 할 때 브라우저에 직접 표시되지 않는 일부 정보를 보냅니다. 이를 HTTP 헤더라고합니다. 이러한 헤더 중 하나 Content-Type는 파일의 MIME 유형 (예 :)과 text/html인코딩 (일명 charset) 을 지정 하는 헤더 입니다. 대부분의 웹 서버는 정보 Content-Type와 함께 헤더를 보내지 만 charset선택 사항입니다. 존재하지 않는 경우 브라우저는 대신 http-equiv="Content-Type". 메타 태그는 웹 서버가 헤더를 보내지 않는 경우 에만 해석 된다는 것을 인식하는 것이 중요합니다 . 실제로 이것은 페이지가 디스크에 저장되고 거기에서 열리는 경우에만 사용된다는 것을 의미합니다.

이 페이지 에는 이러한 것들에 대한 아주 좋은 설명이 있습니다.


답변

나는 또한이 문제에 직면했다. 한편 나는 세 가지 경우에 부딪 혔습니다.

  1. substr ()

    substr()UTF8 문자를 자르는 UTF8 문자열을 사용 하고 있었기 때문에 잘린 문자가 올바르게 표시되지 않았습니다. mb_substr($utfstring, 0, 10, 'utf-8');대신 사용하십시오 . 크레딧

  2. htmlspecialchars ()

    또 다른 문제는 htmlspecialchars()UTF8 문자열 에서 사용 하는 것입니다. 해결 방법은 다음을 사용하는 것입니다.htmlspecialchars($utfstring, ENT_QUOTES, 'UTF-8');

  3. preg_replace ()

    마지막으로 preg_replace()UTF에 문제가 발생할 수 있음을 알았습니다 . $string = preg_replace('/[^A-Za-z0-9ÄäÜüÖöß]/', ' ', $string);예를 들어 코드 는 UTF 문자열 “F (×) = 2 × -3″을 “F 2 “로 변환했습니다. 수정은 mb_ereg_replace()대신 사용하는 것입니다.

이 추가 정보가 이러한 문제를 해결하는 데 도움이되기를 바랍니다.


답변

이전 답변에서 언급했듯이 텍스트가 iso-8859-1인코딩 또는 기타 형식으로 데이터베이스에 작성 되었기 때문에 발생 합니다.

따라서 utf8출력 하기 전에 데이터를로 변환하기 만하면 됩니다.

$text = “string from database”;
$text = utf8_encode($text);
echo $text;


답변

MYSQL 연결이 UTF-8 (또는 사용중인 항목에 따라 latin1)으로 설정되어 있는지 확인하려면 다음을 수행 할 수 있습니다.

$con = mysql_connect("localhost","username","password");
mysql_set_charset('utf8',$con);

또는 이것을 사용하여 사용중인 문자 집합을 확인하십시오.

$con = mysql_connect("localhost","username","password");
$charset = mysql_client_encoding($con);
echo "The current character set is: $charset\n";

더 많은 정보 : http://php.net/manual/en/function.mysql-set-charset.php


답변

문제에 대한 설명에 따르면 데이터베이스의 데이터는 거의 확실하게 Windows-1252 로 인코딩되고 페이지는 거의 확실히 ISO-8859-1 로 제공됩니다 . 이 두 문자 집합은 Windows-1252에 왼쪽 및 오른쪽 둥근 따옴표를 포함하여 ISO-8859-1에없는 16 개의 추가 문자가 있다는 점을 제외하면 동일합니다.

내 분석이 정확하다고 가정 할 때 가장 간단한 해결책은 페이지를 Windows-1252로 제공하는 것입니다. ISO-8859-1에있는 모든 문자가 Windows-1252에도 있기 때문에 작동합니다. PHP에서는 다음과 같이 인코딩을 변경할 수 있습니다.

header('Content-Type: text/html; charset=Windows-1252');

그러나 HTML 파일과 데이터베이스 내용에서 사용중인 문자 인코딩을 실제로 확인하고 일관성을 유지하거나 불가능한 경우 올바르게 변환해야합니다.


답변

이 작업을 수행하여 문자열에서 이러한 문자를 제거하기로 결정했습니다.

ini_set('mbstring.substitute_character', "none");
$text= mb_convert_encoding($text, 'UTF-8', 'UTF-8');