2010-07-07 8 views
3

"Ð ¢ ÐμÑ"레코드가있는 UTF8 열을 포함하는 MySQL DB를 얻었습니다. PHP의 mb_detect_encoding()이 UTF-8이라고 말했습니다. 어떻게이 "공포"를 읽을 수있는 것으로 변형시킬 수 있습니까?"러시아어 단어"를 읽을 수있는 것으로 변환하는 방법은 무엇입니까?

고맙습니다.

+0

인쇄 (예 : 에코)하고 브라우저에서 인코딩을 UTF-8로 선택하면 올바르게 표시됩니까? – quantumSoup

+0

예, 올바르게 표시됩니다 (러시아어로만 표시). 그러나 행을 선택하기 전에 mysql_set_charset ("utf8", $ db)을 수행하고 있다면 - 나는이 "공포"를 느끼게됩니다. – Kirzilla

답변

1

UTF8 인코딩으로 페이지를 출력했습니다. 브라우저가 읽을 수있는 형태로 표시됩니다.

9

나는 "\xd0\xa2\xd0\xb5\xd1" 바이트 문자열을 가지고 있는데, UTF-8로 인코딩 된 문자 인 Те (1 바이트 뒤에 반각 문자 하나 더한 바이트)이 추가 된 것으로 추측됩니다. 당신은 단지 echo() 당신이 UTF-8 인 것으로 선언 한 페이지에, 그것은 브라우저에 제대로 표시해야하는 경우

는 :

<meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> 
... 

something: <?php echo htmlspecialchars($something); ?> 

이 자연스럽게 또한 당신이 .php 파일 자체를 저장해야합니다 의미 많은 비 ASCII 문자가있는 경우 UTF-8 인코딩을 사용합니다. (많은 Windows 텍스트 편집기는 슬프게도 기본적으로 UTF-8로 저장하지 않습니다.)

비 UTF-8 페이지를 사용하려면 iconv()을 사용하여 문자열을 사용중인 인코딩 (Windows 코드)으로 변환해야합니다. 1251 쪽 러시아어 ('cp1251') 그러나 나는 UTF-8을 모든 것을 통해 사용하는 것을 강력히 권장합니다.

편집 다시 주석 :

내가 선택 행하기 전에 mysql_set_charset에게 ("UTF8", $의 DB를)하고있어 경우 -이 "공포"

mysql_set_charset('utf8') 받고 있어요는 참이다 옳은 일. 위와 같이 meta을 포함하고 있는지 확인하고 브라우저에 표시되는지 확인하십시오 (보기 -> 인코딩이 UTF-8인지 확인하십시오).

UTF-8이 올바르게 전송 되더라도 ТеÑ이 발생하는 경우 데이터베이스의 현재 내용이 엉망이됩니다. 아마도 올바른 mysql_set_charset 호출없이 데이터가 이전에 삽입되었거나 잘못된 charset을 사용하는 SQL 가져 오기를 수행했을 수 있습니다.

이 경우 데이터베이스의 각 행을 통과해야하고 iconv()을 사용하여 '수정하여 UTF-8을 ISO-8859-1로 변환해야합니다. 이렇게하면 double-UTF-8 인코딩을 취소해야합니다.

[편집 : 2]

의 iconv ("UTF-8", "ISO-8859-1", $ 행 [ '이름'])라고 공지 사항 :의 iconv() : 감지 불법 문자 입력 문자열에.

OK, 입력이 유효한 UTF-8 시퀀스가 ​​아닙니다. 결국 UTF-8을 데이터베이스에서 가져 오지 않았거나 UTF-8 시퀀스가 ​​잘 렸기 때문일 수 있습니다. 예를 들어 "Ñ" 문자열이 2 바이트 UTF-8 시퀀스의 절반에 불과하므로 문자열 "\xd0\xa2\xd0\xb5\xd1" (ISO-8859-1로 읽음, "ТеÑ"처럼 보임)이 유효하지 않습니다. 브라우저에서 UTF-8로 표현하면 Те�으로 렌더링됩니다.

데이터베이스에있는 것이면 계속 진행하기 전에 데이터를 수정해야합니다. (보기 -> 인코딩을 확인하여) 내가 mysql_set_charset("utf8", $db)

당신은 제대로 UTF-8로 보내는 것을 확인하지 않은 일을하지 않고 $row['name'] 에코와 브라우저가이를 알고있는 경우

그렇게, 괜찮아요 화면에 표시되는 내용이 실제로 의미가 없습니다. echo(); 우리는 원래의 바이트 문자열이 무엇인지 알아낼 수 없습니다.

echo bin2hex($row['name']); 때 표시되는 내용을 알려주십시오. 이렇게하면 문자열의 각 바이트가 16 진수로 변환되므로 "\xd0\xa2\xd0\xb5\xd1"d0a2d0b5d1으로 출력됩니다.

+0

또는 header() 함수를 사용하여 인코딩을 설정할 수도 있습니다. header ('Content-type : text/html; charset = utf-8') – quantumSoup

+0

iconv ("UTF-8", "ISO-8859-1" , $ row [ 'name']) notice : iconv() : 입력 문자열에 잘못된 문자를 감지했습니다. 그러나 mysql_set_charset ("utf8", $ db)을하지 않고 $ row [ 'name']을 echo하면 괜찮습니다 (기본적으로 charset은 latin1입니다) – Kirzilla