Как в PHP определить кодировку строки или файла?

«Как в PHP определить кодировку строки или файла?» — вопрос из категории PHP Core, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для определения кодировки в 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.