2010-12-26 3 views
1

참고 : 일반적으로 제안되는 관련 PHP, UTF-8 문자 인코딩 기사를 모두 읽었지만 제 질문은 그러한 기술을 적용하기 전에 삽입 된 데이터와 관련이 있습니다. 모든 문자 인코딩 문제를 소급 수정하고 싶습니다.잘못된 문자열 인코딩

이제 모든 연결은 PDO를 사용하여 utf8로 설정됩니다.

불행히도 올바른 문자 인코딩 방식을 구현하기 전에 불행히도 상당한 양의 데이터가 삽입되어 의심 스럽습니다. 에 의해 표시되는 :

$sql = "SELECT name FROM data LIMIT 3"; 

foreach ($pdo->query($sql) as $row) 
{ 
    $name = $row['name']; 

    echo $name . "\n"; 
    echo utf8_encode($name) . "\n"; 
    echo utf8_decode($name) . "\n"; 
    echo htmlspecialchars($name, ENT_QUOTES, 'UTF-8') . "\n"; 
    echo htmlspecialchars(utf8_encode($name), ENT_QUOTES, 'UTF-8') . "\n"; 
    echo htmlspecialchars(utf8_decode($name), ENT_QUOTES, 'UTF-8') . "\n"; 
    echo '<hr/>'; 
} 

생산 어떤 :

Antonín Dvořák 
AntonÃÆín DvoÃâ¦Ãâ¢ÃÆák 
Anton�?­n Dvo�?�?�?¡k 
Antonín Dvořák 
AntonÃÆín DvoÃâ¦Ãâ¢ÃÆák 

---------- 
Ô±Ö€Õ¡Õ´ Ô½Õ¡Õ¹Õ¡Õ¿Ö€ÕµÕ¡Õ¶ 
ñÃâ¬Ã¡Ã´ ýáùáÿÃâ¬ÃµÃ¡Ã¶ 
Ա�?ամ Խաչատ�?յան 
Ô±Ö€Õ¡Õ´ Ô½Õ¡Õ¹Õ¡Õ¿Ö€ÕµÕ¡Õ¶ 
ñÃâ¬Ã¡Ã´ ýáùáÿÃâ¬ÃµÃ¡Ã¶ 

---------- 
Tiësto 
Tiësto 
Tiësto 
Tiësto 
Tiësto 
Tiësto 
---------- 

서로 다른 라인에 불구하고, 올바른 항목이 실제로 않는 데이터를 생성하는 PDO와 'SET의 이름을 utf8'을 제거 :

DROP TABLE IF EXISTS `data`; 
CREATE TABLE IF NOT EXISTS `data` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `name` varchar(80) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `name` (`name`(10)), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=0; 

INSERT INTO `data` (`id`, `name`) VALUES (0, 'Antonín Dvořák'), (1, 'Արամ Խաչատրյան'), (2, 'Tiësto'); 
,536 :
Antonín DvoÅák 
Antonín DvoÃÂák 
Antonín Dvořák 
Antonín DvoÅák 
Antonín DvoÃÂák 
Antonín Dvořák 
---------- 
Արամ Խաչատրյան 
Ô±ÖÕ¡Õ´ Ô½Õ¡Õ¹Õ¡Õ¿ÖÕµÕ¡Õ¶ 
???? ????????? 
Արամ Խաչատրյան 
Ô±ÖÕ¡Õ´ Ô½Õ¡Õ¹Õ¡Õ¿ÖÕµÕ¡Õ¶ 
???? ????????? 
---------- 
Tiësto 
Tiësto 
Ti�sto 
Tiësto 
Tiësto 

---------- 

그리고 여기가 해당 데이터베이스 행의 덤프입니다

세 번째 줄 "Tiësto"의 3 번째 줄과 6 번째 줄이 올바르게 에코됩니다. 나는이에게 자신을 시도하지 않은 - - 나는 작업을해야

+0

이 질문을 받았지만 IMO는 여기에 완전히 대답하지 않았습니다 : http://stackoverflow.com/questions/1344692/i-need-help-fixing-broken-utf8-encoding (* * fixable이기 때문에 중복으로 투표하지 않음) –

+0

첫 번째 단계로 확인하십시오 : 데이터베이스 데이터가 100 % 확실한가요? 덤프를하기 위해 당신은 무엇을 사용 했습니까?phpMyAdmin 또는 HeidiSQL과 같은 클라이언트 프로그램이 테이블을 탐색 할 때 깨진 문자를 표시합니까? –

+0

phpMyAdmin은 맨 위 줄에 표시된 내용을 표시합니다. – James

답변

1

한 가지 방법 나쁜 문자열과 올바른의 인코딩을 감지/인코딩를 해결하는 가장 좋은 방법 등 무엇 다만 확실 해요 데이터베이스를 덤프하는 것입니다 phpMyAdmin을 사용하여 파일로 가져오고, 을 으로 인코딩을으로 지정하면 UTF-8로 인코딩됩니다. (가져올 때 드롭 다운 메뉴에서 덤프 파일의 문자 세트를 지정하는 phpMyAdmin 버전이 필요합니다.)

ëë으로 다시 설정해야합니다. 데이터가 지속적으로 깨진 경우 (즉 유효한 UTF-8 문자와 깨진 문자가 혼합되어 있지 않은 경우) 작동 할 수 있습니다.

분명히이 작업을 시도하기 전에 백업을 만들고 나중에 빗으로 데이터를 조사하십시오.

0

오히려 정통 솔루션 내가 찾은 및 테스트 후, 작동하는 것 같군 것입니다

연결 A = UTF8 연결 연결 B 인코딩 = 올드 비 UTF8 연결 원본 데이터

  • A를 사용하면 B와 함께 올바르게 표시되지만 UTF8이 아닌 DB 인코딩으로 인해 A와 함께 손상된 "이름"을 반환합니다.
  • 손상된 A 값을 검색하여 B에서 항목 ID를 찾습니다.
  • 그런 다음 C 올바르게 인코딩 된 UTF8 값

다소 복잡하지만 제대로 작동하는 것 같습니다. 문제가 있으면 업데이트합니다.