정말 좋은 답변이 있으며 여기에 귀하의 질문에 대한 답변을 시도합니다. 나는 인코딩 마스터가 아니지만 순수한 UTF-8 스택을 데이터베이스에 가져 가고 싶다는 당신의 이해를 이해합니다 . utf8mb4
테이블, 필드 및 연결에 MySQL의 인코딩을 사용 하고 있습니다.
"상황은 데이터가 HTML 양식 또는 전자 메일 등록 링크에서 올 때 UTF-8을 처리하기 위해 소독제, 유효성 검사기, 비즈니스 논리 및 준비된 명령문이 필요합니다." 그래서 간단한 방법으로이 아이디어로 시작했습니다.
- 인코딩을 감지하려고 시도하십시오.
$encodings = ['UTF-8', 'ISO-8859-1', 'ASCII'];
- 인코딩이 감지되지 않으면
throw new RuntimeException
- 입력이 계속
UTF-8
되면 계속하십시오.
그렇지 않으면 ISO-8859-1
또는ASCII
ㅏ. UTF-8 로의 변환을 시도하십시오 (대기, 완료되지 않음)
비. 변환 된 값의 인코딩을 감지
씨. 보고 된 인코딩 및 변환 된 값이 모두 인 UTF-8
경우 계속하십시오.
디. 그밖에,throw new RuntimeException
내 추상 수업에서 Sanitizer
private function isUTF8($encoding, $value)
{
return (($encoding === 'UTF-8') && (utf8_encode(utf8_decode($value)) === $value));
}
private function utf8tify(&$value)
{
$encodings = ['UTF-8', 'ISO-8859-1', 'ASCII'];
mb_internal_encoding('UTF-8');
mb_substitute_character(0xfffd); //REPLACEMENT CHARACTER
mb_detect_order($encodings);
$stringEncoding = mb_detect_encoding($value, $encodings, true);
if (!$stringEncoding) {
$value = null;
throw new \RuntimeException("Unable to identify character encoding in sanitizer.");
}
if ($this->isUTF8($stringEncoding, $value)) {
return;
} else {
$value = mb_convert_encoding($value, 'UTF-8', $stringEncoding);
$stringEncoding = mb_detect_encoding($value, $encodings, true);
if ($this->isUTF8($stringEncoding, $value)) {
return;
} else {
$value = null;
throw new \RuntimeException("Unable to convert character encoding from ISO-8859-1, or ASCII, to UTF-8 in Sanitizer.");
}
}
return;
}
인코딩 문제 를 추상 Sanitizer
클래스와 분리 하고 Encoder
객체를의 구체적인 자식 인스턴스에 삽입 해야한다고 주장 할 수 Sanitizer
있습니다. 그러나 내 접근 방식의 주요 문제는 더 많은 지식이 없으면 원하지 않는 인코딩 유형을 거부한다는 것입니다 (PHP mb_ * 함수에 의존하고 있음). 더 이상의 연구가 없다면, 그것이 일부 인구에 해를 끼치는 지 아닌지 (또는 중요한 정보를 잃어버린 경우) 알 수 없습니다. 그래서 더 배울 필요가 있습니다. 이 기사를 찾았습니다.
모든 프로그래머가 텍스트로 작업하기 위해 인코딩 및 문자 세트에 대해 긍정적으로 알아야 할 사항
또한 암호화 된 데이터가 전자 메일 등록 링크에 추가되면 ( OpenSSL
또는 사용 mcrypt
) 어떻게됩니까? 이것이 디코딩을 방해 할 수 있습니까? Windows-1252는 어떻습니까? 보안 영향은 어떻습니까? 사용 utf8_decode()
하고 utf8_encode()
있는이 Sanitizer::isUTF8
모호한 있습니다.
사람들은 PHP mb_ * 함수의 단점을 지적했습니다. 조사하는 데 시간 iconv
이 걸리지 않았지만 mb_ * functions보다 효과가 좋으면 알려주십시오.