물음표와 함께 검은색 다이아몬드가 거의 표시되지 않는 PHP 출력
데이터베이스 소스에서 가져온 php 프로그램을 쓰고 있습니다.일부 varchar에는 물음표가 있는 검은 다이아몬드로 표시된 따옴표가 있습니다(,, REPLACHENT CHARGER, Microsoft Word 텍스트에서 추측).
php를 사용하여 이러한 문자를 제거하려면 어떻게 해야 합니까?
이 문자(「U+FFPD 「REPLACHENT CHARGER」)가 표시되는 경우는, 통상은 텍스트 자체가 싱글 바이트 부호화의 형태로 부호화되어 있습니다만, Unicode 부호화(UTF8 또는 UTF16)의 어느 쪽인가로 해석되고 있는 것을 의미합니다.
반대로 하면 (보통) 이렇게 생겼을 거야.
아마 원래 인코딩은 ISO-8859-1일 것입니다.일명 Latin-1입니다.스크립트를 변경할 필요 없이 이를 확인할 수 있습니다.브라우저는 다른 인코딩으로 페이지를 재해석하는 옵션을 제공합니다.Firefox 에서는 "View" -> "Character Encoding" 을 사용합니다.
브라우저에서 올바른 인코딩을 사용하려면 다음과 같이 HTTP 헤더를 추가합니다.
header("Content-Type: text/html; charset=ISO-8859-1");
또는 인코딩을 메타 태그에 넣습니다.
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
또는 데이터베이스에서 다른 부호화(UTF-8, 가급적)로 읽거나 텍스트를 로 변환할 수도 있습니다.
저도 이 ★의 문제에 직면했습니다.그러던 중 세 가지 사례를 접하게 되었습니다.
기판()
는 용 i i용었 i i i i i 。
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 2"로 변환했습니다.수정은 대신 사용하는 것입니다.
저는 이 추가 정보가 이러한 문제를 해결하는 데 도움이 되기를 바랍니다.
이것은 charset의 문제입니다.그 때문에, 많은 레벨에서 문제가 발생했을 가능성이 있습니다만, 대부분의 경우, 데이터베이스내의 문자열은 utf-8로 부호화되어 있어, ISO-8859-1로서 표시되고 있습니다.아니면 그 반대일 수도 있어요.
이 문제를 해결하는 적절한 방법은 문자 집합을 바로 잡는 것입니다.PHP를 사용하고 있기 때문에 가장 간단한 전략은 어플리케이션 전체에서 iso-8859-1을 사용하는 것입니다.그러기 위해서는 다음 사항을 확인해야 합니다.
- 모든 PHP 소스 파일은 iso-8859-1로 저장됩니다(cp-1252와 혼동하지 마십시오).
- 는, 「」가 붙은 되어 있습니다.
charset=iso-8859-1
- 또는 를 사용하여 PHP 문서 내에서 웹 서버 설정을 재정의할 수 있습니다.
- 또한 HTML에 동일한 것을 지정하는 메타 태그를 삽입할 수도 있지만, 이것이 꼭 필요한 것은 아닙니다.
- 또, 다음의 항목을 지정할 수도 있습니다.
accept-charset
on 。<form>
★★★★★★★★★★★★★★★★★★. - 데이터베이스 테이블은 latin1로 인코딩되어 정의됩니다.
- 에 대한 PHP와 데이터베이스 간의 데이터베이스 연결이 latin1로 설정되었습니다.
데이터베이스에 이미 데이터가 있는 경우 데이터가 이미 엉망이 되어 있을 수 있습니다.아직 실가동 단계에 있지 않은 경우 모두 지우고 다시 시작하십시오.그렇지 않으면 데이터를 정리해야 합니다.
메타 태그에 대한 메모: 모두가 메타 태그가 무엇인지 잘못 알고 있습니다.
웹 서버는 파일(HTML 문서)을 서비스할 때 브라우저에 직접 표시되지 않는 정보를 보냅니다.HTTP를 사용합니다.헤더의 는, 「」입니다.Content-Type
header:예: "MIMType" "MIMType")text/html
문자 집합대부분의 웹 서버는 다음 메시지를 전송합니다.Content-Type
charset
정보는 옵션입니다.가 없는 메타 합니다.http-equiv="Content-Type"
메타 태그는 웹 서버가 헤더를 전송하지 않는 경우에만 해석된다는 것을 인식하는 것이 중요합니다.실제로는 페이지가 디스크에 저장되어 거기에서 열리는 경우에만 사용됩니다.
이 페이지는 이러한 것들에 대해 매우 잘 설명하고 있습니다.
처럼, 때문입니다.iso-8859-1
부호화 또는 기타 형식입니다.
때문에 를 터터변변 the the the the the the the the the the the the the로 하면 됩니다.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
이 코드를 페이지 맨 위에 붙여넣기만 하면 됩니다.
<?php
header("Content-Type: text/html; charset=ISO-8859-1");
?>
이렇게 해서 문자열에서 이 캐릭터들을 제거하기로 했습니다.
ini_set('mbstring.substitute_character', "none");
$text= mb_convert_encoding($text, 'UTF-8', 'UTF-8');
문제의 설명에 근거해, 데이타베이스내의 데이터는 Windows-1252 로 인코딩 되어 있어, 페이지는 ISO-8859-1 로서 기능하고 있는 것이 거의 확실합니다.Windows-1252에는 ISO-8859-1에는 없는 추가 문자가 16개 있다는 점(왼쪽과 오른쪽의 곱슬따옴표 포함)을 제외하고 이 2개의 문자 세트는 동일합니다.
제 분석이 맞다고 가정하면, 가장 간단한 해결책은 당신의 페이지를 Windows-1252로 처리하는 것입니다.ISO-8859-1에 있는 모든 문자가 Windows-1252에도 있기 때문에, 이 조작은 유효합니다.PHP에서는 다음과 같이 인코딩을 변경할 수 있습니다.
header('Content-Type: text/html; charset=Windows-1252');
단, HTML 파일 및 데이터베이스 콘텐츠에서 사용하는 문자 인코딩을 확인하고 일관성을 유지하도록 주의하거나 이것이 불가능한 경우 적절하게 변환해야 합니다.
이 함수를 변수 utf8_encode($your variable)에 추가합니다.
시험해 보세요
mb_substr($description, 0, 490, "UTF-8");
이걸 안에 .<head>
부착
<meta charset="iso-8859-1">
유니코드 또는 기타 문자 집합의 불일치가 원인일 수 있습니다.브라우저에서 문자 집합을 변경해 보십시오. 설정에서 텍스트는 정상으로 표시됩니다.그런 다음 데이터베이스 내용을 표시에 사용하는 문자 집합으로 변환하는 방법에 대한 질문입니다.(실제로 출력에 utf-8 charset 스테이트먼트를 추가하는 것만으로 끝납니다).
테이블을 수정한 후 최종적으로 실행한 것은 백업하고 설정을 utf-8로 되돌린 후 덤프 파일을 변경하여 DEFAULT CHARGER SET utf8_general_ci가 문자 집합 엔트리가 되도록 했습니다.
데이터베이스와 브라우저가 utf8이기 때문에 문자셋의 문제가 없어졌습니다.
원인이 뭔지 알아냈어요DB에 대한 웹 페이지+브라우저 효과입니다.Linux(ubuntu+firefox)인 터미널에서는 데이터베이스를 latin1로 인코딩하고 있습니다.이것이 탭이 설정되어 있는 것입니다.다만, Windows 10+엣지 터미널에서는, 엔트리가 utf8 에 강제적으로 코드화되어 있습니다.또, Windows 10이 latin1에 머무르는 것에 문제가 있는 것을 깨달았기 때문에, 바람에 맞추어 구부려 utf8로 변환하기로 했습니다.
win 10 단말기를 사용하기 시작했기 때문에 윈도우 10의 문제라고 생각했습니다.그 때문에, Microsoft 의 버그도 문제를 일으킵니다.Windows 10 의 브라우저는 latin1 문자 세트를 표시하고 있습니다만, utf8 로 인코딩 되어 데이터 이상이 표시되기 때문에, 아직 폼의 인코딩이 변경되는 이유를 알 수 없습니다.그러나 Linux+firefox 에서는 그렇지 않습니다.
제 경우엔 이런 일이 벌어졌습니다.
$text = utf8_decode($text)
검은색 다이아몬드 문자를 물음표로 변환하여 다음을 수행할 수 있습니다.
$text = str_replace('?', '', utf8_decode($text));
헤더 앞에 이 행을 추가합니다.
정확한 포맷.doc/docx
파일이 검색됩니다.
if(ini_get('zlib.output_compression'))
ini_set('zlib.output_compression', 'Off');
ob_clean();
어디서든 데이터를 추출할 때는 접두사가 붙은 함수를 사용해야 합니다.md_FUNC_NAME
.
나도 같은 문제를 겪었어
또는 이 기호의 코드를 찾아 regexp를 사용하여 이러한 기호를 삭제할 수 있습니다.
브라우저의 문자 세트를 변경할 수도 있습니다.디버깅의 이유일 뿐입니다.
데이터베이스와 HTML 양쪽에서 같은 문자 집합(여기서 제안)을 사용하는 것은 나에게 작동하지 않습니다.그래서 코드가 HTML로 생성된다는 것을 기억하면서, 저는 이 코드를 사용하는 것을 선택했습니다."
(HTML 코드) 또는"
(ISO Latin-1 코드)는 따옴표가 사용된 데이터베이스 텍스트에 포함되어 있습니다.이것으로 문제가 해결되었고, 견적도 받았습니다.이 솔루션 이전에는 따옴표와 아포스트로피 중 일부만 올바르게 표시되지 않았지만 다른 일부만 올바르게 표시되었지만 모든 인스턴스에서 특수 코드가 작동했다는 점에 유의하십시오.
phpmyadmin에서 조회 변경 후 "detect encoding" 코드를 실행했는데 Latin_1로 표시됩니다.
그러나, 애플리케이션의 다른 데이터 이상과 그 수정 방법에 대해 알게 된 것은, 다음과 같습니다.
방금 부호화가 혼재된 테이블을 Import했습니다(일부 행에 다이아몬드 물음표가 있고 모두 같은 열에 있습니다).이것이 수정 코드입니다.정의되지 않은 자리 표시자를 가져와 "다이아몬드 물음표" 대신 일반 물음표를 할당하는 utf8_decode 프로세스를 사용하여 물음표를 따옴표 사이에 공백으로 대체했습니다.여기 [코드]가 있습니다.
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>";
}
?>
글로벌용.
각 텍스트를 변환, 코드화, 디코딩하는 대신 그대로 두고 서버 php 설정을 변경하는 것이 좋습니다.그렇게,
다이아몬드를 놔두자
브라우저의 보기 메뉴에서 "텍스트 인코딩"을 선택하고 텍스트를 올바르게 볼 수 있는 인코딩을 찾습니다.
php.ini를 편집하여 추가합니다.
default_charset = "ISO-8859-1"
ISO-8859 대신 텍스트 인코딩에 맞는 것을 사용할 수도 있습니다.
phpmyadmin에서 데이터베이스를 선택하고 테이블 필드의 길이/값을 500 또는 1000으로 늘리면 문제가 해결됩니다.
언급URL : https://stackoverflow.com/questions/275411/php-output-showing-little-black-diamonds-with-a-question-mark
'programing' 카테고리의 다른 글
Bootstrap Vue 테이블의 첫 번째 필드로 확인란을 설정하는 방법 (0) | 2022.10.02 |
---|---|
하위 프로세스에 대한 비차단 읽기입니다.Python의 파이프 (0) | 2022.10.02 |
대부분의 거대한 방법은 존재하지 않을지도 모른 파일을 삭제합니다. (0) | 2022.09.26 |
필드에 $x가 포함되지 않는 SQL 쿼리 (0) | 2022.09.26 |
Android Studio Gradle 프로젝트 "VM의 데몬 프로세스/초기화를 시작할 수 없습니다" (0) | 2022.09.26 |