Засичане на кодировка на файл.

dakata__92

Super Moderator
Здравейте. Как мога да засека в какъв енкодинг е файл от тип txt или csv? Искам да проверя дали файла е в кодировка UTF-8 или UTF-8 BOM. В момента правя хей тази глупост, но не ми харесва:


PHP:
switch ($extension) {
    case 'txt':
    case 'csv':
        $encoding = mb_detect_encoding(file_get_contents($document), mb_detect_order(), true);
        if ($encoding !== 'UTF-8') {
            throw new FrontendException(__('conditions.document.upload.encoding.utf_8'));
        }
        break;
}
 
Последно редактирано:
Въпросът ти подразбира, че е известно, текстът е точно едно от двете, в който случай тоя коментар би трябвало да помогне? https://www.php.net/manual/en/function.mb-detect-encoding.php#91051

Т.е. условието дали има БОМ е

PHP:
substr($text, 0, 3) == UTF8_BOM

където
PHP:
define ('UTF8_BOM', chr(0xEF) . chr(0xBB) . chr(0xBF));
 
Или

PHP:
strncmp($text, UTF8_BOM, 3) === 0

И алтернативно за UTF8_BOM също става
PHP:
pack("CCC", 0xEF, 0xBB, 0xBF)

Според зависи кое ти се струва по-изчистен вариант.
 
Добре. За BOM ми стана ясно какво да правя. Обаче искам когато постъпва txt или csv файл да засичам кодировката на файла и ако не е UTF - 8 да спирам изпълнението на файла. Не желая да прочитам цялото съдържание на файла с file_get_contents при въвеждане на файла, за да валидирам съдържанието му. Няма ли по-културен начин от моя по-горе?
 

Back
Горе