보통은 한글이 깨지는 경우가 많은데, 영어도 인코딩이 깨졌다.
근데 이것저것 추가해봐도 잘안되서 챗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
인코딩이 소스 텍스트의 모든 문자를 지원하는지 확실하지 않은 경우에는 항상 "//TRANSLIT" 옵션을 사용하는 것이 좋다고 한다.
근데 수정 후 또 오류가 발생해서.. 다시 질문하러갔다.ㅠㅠ
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.
하지만 여전히 되지않음..
1. 인코딩 확인 후 변경 완료
2. TRANSLIT , IGNORE 둘다 사용 (최종은 TRANSLIT으로 적용)
3. PHP 파일 인코딩 확인 및 변경
- 확인해보니 ANSI로 되어있었다.. UTF8로 변경하였다 ㅎ 이게 가장 큰 원인이였던 것 같다. (근데 왜 특정 부분만깨지냐고요?)
4. 데이터베이스 인코딩 설정 및 코드 추가
-원래도 있었음.
mysql_query ( 'set names utf8' );
5. 라이브러리 사용 x
잠깐 삽질했었는데 .. 아주 최고다..친절한 설명까지 이젠 챗지피티가 내 사수야
'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 |