Ответ
Для определения кодировки в PHP используется расширение mbstring. Вот основные подходы:
1. Определение кодировки строки:
$string = "Текст для проверки";
// Базовый вариант
$detectedEncoding = mb_detect_encoding($string);
// Более надежный вариант с указанием списка возможных кодировок
$possibleEncodings = ['UTF-8', 'Windows-1251', 'ISO-8859-1', 'KOI8-R'];
$encoding = mb_detect_encoding($string, $possibleEncodings, true);
if ($encoding === false) {
echo "Кодировка не определена";
} else {
echo "Определенная кодировка: " . $encoding; // Например, UTF-8
}
2. Проверка, является ли строка валидной UTF-8:
function isValidUtf8(string $string): bool {
return mb_check_encoding($string, 'UTF-8');
}
// Альтернатива с использованием регулярного выражения
function isUtf8Regex(string $string): bool {
return preg_match('//u', $string) === 1;
}
3. Определение кодировки файла:
function detectFileEncoding(string $filePath): ?string {
if (!file_exists($filePath)) {
throw new RuntimeException("Файл не найден: $filePath");
}
$content = file_get_contents($filePath);
// Проверка BOM (Byte Order Mark) для UTF-8
if (substr($content, 0, 3) === "xEFxBBxBF") {
return 'UTF-8'; // Файл с BOM
}
return mb_detect_encoding($content, ['UTF-8', 'Windows-1251', 'CP1251', 'ISO-8859-1'], true);
}
4. Использование iconv для определения и конвертации:
function convertToUtf8(string $string): string {
$encoding = mb_detect_encoding($string, ['UTF-8', 'Windows-1251'], true);
if ($encoding !== 'UTF-8') {
// Конвертируем в UTF-8
$converted = iconv($encoding, 'UTF-8//IGNORE', $string);
return $converted !== false ? $converted : $string;
}
return $string;
}
Важные замечания:
mb_detect_encoding()не всегда точен, особенно для коротких строк.- Всегда указывайте список ожидаемых кодировок для повышения точности.
- Для работы с файлами проверяйте наличие BOM-маркеров.
- Расширение
mbstringдолжно быть включено в PHP.