제로보드4에서 한글깨질때 고치는 법

728x90
반응형

DB를 먼저 고치지 말고 연결/출력 설정부터 맞춰 보세요. 데이터는 대부분 멀쩡한 경우가 많아서, 함부로 변환하면 오히려 되돌리기 어려워집니다. 이미지만 보고 추정한 것이라 확정은 아닙니다.

이미지에서 보이는 단서

  • "공지", "목록", "다음" 같은 화면 문구는 정상입니다. 그래서 페이지 자체의 인코딩은 맞고, DB에서 꺼낸 글자만 깨진 것입니다.
  • 글자가 깨진 모양이 두 가지로 섞여 있습니다.
    • �댁뭡 같은 물음표 박스 모양: 한글 바이트가 다른 인코딩으로 잘못 해석된 경우입니다.
    • 理쒖떊, 寃뚯떆 같은 한자 모양: UTF-8로 저장된 글자를 EUC-KR로 읽은 경우입니다.
  • 글마다 모양이 다른 걸 보면, 글이 쓰인 시기에 따라 EUC-KR과 UTF-8이 섞여 저장됐을 가능성이 있습니다. 이 경우 설정 하나로 전부 고쳐지지는 않습니다.

순서대로 해볼 것

  1. 백업: mysqldump로 DB를 통째로 받아 둡니다. 이후 어떤 작업도 이 백업을 두고 시작하세요.
  2. 데이터가 실제로 어떤 인코딩인지 확인: phpMyAdmin이나 mysql에서 SELECT subject, HEX(subject) FROM zetyx_board_게시판이름 LIMIT 10;을 실행합니다. 한글 바이트가 B0~C8로 시작하면 EUC-KR이고, EA~ED로 시작하면 UTF-8입니다.
  3. 연결 인코딩을 데이터에 맞추기: 제로보드4는 원래 EUC-KR 페이지에 EUC-KR 데이터를 씁니다. DB 연결 직후(lib.php나 _head.php의 mysql_connect 다음 줄)에 mysql_query("set names euckr");을 넣어 보세요. 안 되면 set names latin1도 시도해 봅니다. 보통 이 한 줄로 해결됩니다.
  4. 웹 서버가 보내는 문자셋 확인: Apache의 AddDefaultCharset UTF-8 설정이나 .htaccess가 페이지 meta 태그보다 우선합니다. 페이지가 EUC-KR이면 서버도 같은 값이어야 합니다.
  5. 그래도 일부만 깨지면: 그 글들은 UTF-8 데이터가 섞여 있는 것이므로 해당 행만 따로 변환해야 합니다. 2번의 HEX 결과를 보여 주시면 어떻게 변환할지 알려드릴 수 있습니다.

참고

  • 제로보드4는 mysql_* 함수를 쓰기 때문에 PHP 7 이상(예: 시놀로지 PHP 7.3)에서는 아예 돌아가지 않습니다. 현재 보이는 건 돌아가는 상태이니 PHP 5.x일 가능성이 큽니다. 서버를 옮기신다면 이 점을 먼저 확인해야 합니다.
728x90
반응형