물음표와 함께 작은 검은 색 다이아몬드를 보여주는 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"
. 메타 태그는 웹 서버가 헤더를 보내지 않는 경우 에만 해석 된다는 점을 인식하는 것이 중요합니다 . 실제로 이것은 페이지가 디스크에 저장되고 거기에서 열리는 경우에만 사용된다는 것을 의미합니다.
이 페이지 에는 이러한 것들에 대한 아주 좋은 설명이 있습니다.
나는 또한이 문제에 직면했다. 한편 나는 세 가지 경우에 부딪 혔습니다.
substr ()
substr()
UTF8 문자를 잘라내는 UTF8 문자열을 사용 하고 있었으므로 잘라낸 문자를 올바르게 표시 할 수 없습니다.mb_substr($utfstring, 0, 10, 'utf-8');
대신 사용하십시오 . 크레딧htmlspecialchars ()
또 다른 문제는
htmlspecialchars()
UTF8 문자열 에서 사용 하는 것입니다. 해결 방법은 다음을 사용하는 것입니다.htmlspecialchars($utfstring, ENT_QUOTES, 'UTF-8');
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');
이것을 시도하십시오
mb_substr ($ description, 0, 490, "UTF-8");
이 함수를 변수에 추가하십시오. utf8_encode ($ your variable);
이는 유니 코드 또는 기타 문자 집합 불일치로 인해 발생할 수 있습니다. 브라우저에서 문자 집합을 변경해보십시오. 설정에서 텍스트가 정상적으로 보일 것입니다. 그런 다음 데이터베이스 내용을 표시하는 데 사용하는 문자 집합으로 변환하는 방법에 대한 질문입니다. (실제로 출력에 utf-8 charset 문을 추가 할 수 있습니다.)
테이블을 수정 한 후 결국 내가 한 일은 백업하고 설정을 utf-8로 다시 변경 한 다음 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci가 내 문자 집합 항목이되도록 덤프 파일을 변경하는 것입니다.
이제 데이터베이스와 브라우저가 utf8이기 때문에 더 이상 문자 집합 문제가 없습니다.
그 원인을 알아 냈습니다. DB에 대한 웹 페이지 + 브라우저 효과였습니다. Linux (ubuntu + firefox) 인 터미널에서는 탭이 설정된 latin1로 데이터베이스를 인코딩했습니다. 그러나 Windows 10 + edge 터미널에서는 항목이 utf8로 강제 코딩되었습니다. 또한 Windows 10에 latin1에 머무르는 데 문제가 있음을 알았으므로 바람에 따라 구부리고 모두 utf8로 변환하기로 결정했습니다.
Win 10 터미널을 사용하기 시작했기 때문에 Windows 10 문제라고 생각했습니다. 다시 한 번 Microsoft 버그로 인해 문제가 발생합니다. Windows 10의 브라우저가 latin1 문자 집합을 표시하기 때문에 양식에서 인코딩이 변경되는 이유를 모르겠지만 utf8로 인코딩되어 데이터 이상이 발생합니다. 하지만 linux + firefox에서는 그렇게하지 않습니다.
헤더 앞에이 줄을 추가하기 만하면됩니다.
정확한 .doc/docx
파일 형식 이 검색됩니다.
if(ini_get('zlib.output_compression'))
ini_set('zlib.output_compression', 'Off');
ob_clean();
This will help you. Put this inside <head>
tag
<meta charset="iso-8859-1">
Just Paste This Code In Starting to The Top of Page.
<?php
header("Content-Type: text/html; charset=ISO-8859-1");
?>
You can also change the caracter set in your browser. Just for debug reasons.
Using the same charset (as suggested here) in both the database and the HTML has not worked for me... So remembering that the code is generated as HTML, I chose to use the "
(HTML code) or the "
(ISO Latin-1 code) in my database text where quotes were used. This solved the problem while providing me a quotation mark. It is odd to note that prior to this solution, only some of the quotation marks and apostrophes did not display correctly while others did, however, the special code did work in all instances.
I ran the "detect encoding" code after my collation change in phpmyadmin and now it comes up as Latin_1.
but here is something I came across looking a different data anomaly in my application and how I fixed it:
I just imported a table that has mixed encoding (with diamond question marks in some lines, and all were in the same column.) so here is my fix code. I used utf8_decode process that takes the undefined placeholder and assigns a plain question mark in the place of the "diamond question mark " then I used str_replace to replace the question mark with a space between quotes. here is the [code]
include 'dbconnectfile.php';
//// the variable $db comes from my db connect file
/// inx is my auto increment column
/// broke_column is the column I need to fix
$qwy = "select inx,broke_column from Table ";
$res = $db->query($qwy);
while ($data = $res->fetch_row()) {
for ($m=0; $m<$res->field_count; $m++) {
if ($m==0){
$id=0;
$id=$data[$m];
echo $id;
}else if ($m==1){
$fix=0;
$fix=$data[$m];
$fix = utf8_decode($fix);
$fixx =str_replace("?"," ",$fix);
echo $fixx;
////I echoed the data to the screen because I like to see something as I execute it :)
}
}
$insert= "UPDATE Table SET broke_column='".$fixx."' where inx='".$id."'";
$insresult= $db->query($insert);
echo"<br>";
}
?>
This happened to work in my case:
$text = utf8_decode($text)
I turns the black diamond character into a question mark so you can:
$text = str_replace('?', '', utf8_decode($text));
For global purposes.
Instead of converting, codifying, decodifying each text I prefer to let them as they are and instead change the server php settings. So,
- Let the diamonds
- From the browser, on the view menu select "text encoding" and find the one which let's you see your text correctly.
Edit your php.ini and add:
default_charset = "ISO-8859-1"
or instead of ISO-8859 the one which fits your text encoding.
When you extract data from anywhere you should use functions with the prefix md_FUNC_NAME
.
Had the same problem it helped me out.
Or you can find the code of this symbol and use regexp to delete these symbols.
Go to your phpmyadmin and select your database and just increase the length/value of that table's field to 500 or 1000 it will solve your problem.
'Program Tip' 카테고리의 다른 글
새 도구 모음과 함께 탭 사용 (AppCompat v7-21) (0) | 2020.10.31 |
---|---|
Anaconda Python은 Windows에서 어디에 설치됩니까? (0) | 2020.10.31 |
퍼블릭 데이터 멤버 vs 게터, 세터 (0) | 2020.10.31 |
mysql SQL : 특정 항목을 먼저 표시하고 나머지 항목을 정렬합니다. (0) | 2020.10.31 |
Objective-C에서 nil, NIL 및 null의 차이점 (0) | 2020.10.31 |