LINUX.ORG.RU

PHP - вопрос по кодировке

 ,


0

1

С-но вопрос - хочу попробовать реализовать алгоритм Хаффмана на PHP. Решил для начала составить таблицу частотности. Пробую следующий код:

while (!feof($handle)) {
	$contents = fread($handle, $fragment_size);

	for($i=0; $i<strlen($contents); $i++){

		$freqTable[ord($contents[$i])]++;
	}
}

foreach ($freqTable as $k => $v){
	echo chr($k)." - $v<br>";
}

т.е. у нас массив из 256 элементов. Номер элемента соответствует ASCII коду. В итоге, в цикле у меня вместо нормальных символов(а я сканирую текстовый файл) выводится тарабарщина. Я так понимаю, проблема в том, что у нас текст может быть, например, в юникоде. Я пробовал разобраться, как узнать, в какой именно кодировке пришел текст. Насколько я понял, нет стопроцентно верного способа определить кодировку. Т.е. текстовые редакторы анализируют текст в различных кодировках и находят какие-то последовательности, имеющие смысл и в зависимости от этого отображают текст в нужной кодировке.

Суть вопроса - мне нужно универсальное решение, не зависящее от кодировки, чтобы составить таблицу частотности. Причем, в дальнейшем, предполагается процесс распаковки, т.е. мне нужно записать данные в той же кодировке.

Пните пожалуйста в нужную сторону. Возможно я просто что-то не понимаю и дофига лишнего додумал, а все на самом деле проще. Заранее спасибо за помощь


Определять кодировку незачем, если будеш все переводить в UNICODE то получиш больше проблем чем профита, ты спокойно можеш дальше работать с этой «тарабарщиной» когда ее сбросиш в выходной файл получиш точно такойже текстовый файл как и на входе. Воспринимай входной вайл не как тестовый а как бинарный и все ...

zaz ★★★★
()

По поводу кодировок можеш почитать про UNICODE и его кодировки UTF-8/16/32, всякие codepage (которые были до юникода)

И касательно PHP multibyte strings и посмотреть функицию mb_detect_encoding - но я бы не стал заморачиватся (по крайней мере на первом этапе) - работайте с файлами как с бинарными данными ...

zaz ★★★★
()

PHP вообще плохо подходит - в нем поддержка юникода через жопу. Стандартные функции chr/ord не имеют аналогов для юникода. Начать надо с реализации этих функций. Далее, понадобится использовать mb_strlen вместо strlen и так далее.

amomymous ★★★
()
Ответ на: комментарий от zaz

mb_detect_encoding

Она в php, можно сказать, не работает.

r_asian ★☆☆
()
Ответ на: комментарий от zaz

Спасибо за ответ! Хорошо, допустим, я не буду заморачиваться с кодировкой. Но как мне построить таблицу частотности? Мне нужно узнать код символа без привязки к кодировке, т.е. я понимаю функция ord для определения ascii кода символа тут не подойдет?

gwyllum
() автор топика
Ответ на: комментарий от gwyllum

Наоборот она делает именно то что вам нужно, и код который вы написали выше как раз это и делает - строит таблицу частотности БАЙТОВ для входного БИНАРНОГО файла.

zaz ★★★★
()

iconv

реализации Хаффман вроде есть готовые

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.