크롤링을 하다 보면, 텍스트가 제대로 들어오지 않는 경우가 많다. 보통은 한글이 깨지는 경우가 많은데, 영어도 인코딩이 깨졌다.
이것저것 시도해봐도 잘 안돼서 챗GPT에게 질문하였다.
내가 시도한 것
1. 헤더에 인코딩 지정하기
header('Content-Type: text/html; charset=utf-8');
2. iconv 사용하기
iconv('iso-8859-1', 'UTF-8', $text);
위 방법으로는 해결이 되지않았다.
해결방안
첫 번째 시도

- `mb_internal_encoding('UTF-8');`
- `<meta charset="UTF-8">`
- `$text = iconv('ISO-8859-1', 'UTF-8', $text);`
이미 기존에 시도했던 것들이다.
두 번째 시도

원본 웹에서 인코딩을 확인했다.

UTF8과 iso-8859-1로 되어있었다.
// 기존
$text = iconv('ISO-8859-1', 'UTF-8', $text);
// 변경
$text = iconv("ISO-8859-1", "UTF-8//TRANSLIT", $text);
3번째에 알려준 코드로 다시 시도하니까 정상 출력됐다. 함수에 `"//TRANSLIT"` 옵션을 추가하면 iconv소스 텍스트에서 대상 인코딩에서 지원하지 않는 문자를 음역 하도록 해주는 옵션이다.
해당 옵션을 사용하지 않으면 인코딩으로 표현할 수 없는 문자는 물음표 또는 기타 자리 표시자 문자로 대체되어 인코딩이 손실될 수 있다고 한다.
주의할 점
ISO-8859-1
ISO-8859-1(Latin-1)은 서유럽 언어(영어, 프랑스어, 독일어 등)를 지원하는 8비트 단일 바이트 문자 인코딩 표준으로, 아스키(ASCII)를 확장하여 191개의 그래픽 문자를 포함한다. 아메리카, 서유럽, 오세아니아에서 주로 사용하나, 요새는 UTF-8 대체되었다고 한다.
인코딩이 소스 텍스트의 모든 문자를 지원하는지 확실하지 않은 경우에는 항상 "//TRANSLIT" 옵션을 사용하는 것이 좋다고 한다.
추가오류
근데 수정 후에 또 오류가 발생해서.. 다시 질문하러 갔다.ㅠㅠ
BOM 제거

BOM을 제거하기 위해 아래 코드를 추가하였다.
if (substr($text, 0, 3) == "\xef\xbb\xbf") {
$text = substr($text, 3);
}
// Convert the text to UTF-8 encoding using iconv
$text = iconv('iso-8859-1', 'UTF-8//TRANSLIT', $text); // //TRANSLIT or //IGNORE.
하지만 여전히 되지 않음..
PHP 파일 인코딩 확인 📌

1. 인코딩 확인 후 변경 완료
2. TRANSLIT , IGNORE 둘 다 사용 (최종은 TRANSLIT으로 적용)
3. PHP 파일 인코딩 확인 및 변경
- 확인해 보니 ANSI로 되어있었다.. UTF8로 변경하였다 ㅎ 이게 가장 큰 원인이었던 것 같다. (근데 왜 특정 부분만 깨지냐고요?🤔)
4. 데이터베이스 인코딩 설정 및 코드 추가
- 원래도 되어있었음.
mysql_query ( 'set names utf8' );
5. 원래도 라이브러리 사용하지 않았고, 추가로 라이브러리를 사용하지 않았다.
잠깐 삽질했었는데.. 아주 최고다.. 친절한 설명까지 이젠 챗지피티가 내 사수야
'Development > PHP' 카테고리의 다른 글
| [PHP] 내가 작성한 코드 리팩토링 하기 (0) | 2023.03.22 |
|---|---|
| [PHP] DateTime:: Unexpected character 에러 해결하기 (0) | 2023.03.20 |
| [PHP] iconv 사용 시 텍스트가 잘릴 때 (0) | 2023.01.26 |
| openssl 연동의 늪(해결 완료) (0) | 2023.01.19 |
| PHP Notice: Use of undefined constant (0) | 2023.01.18 |