|
|
|
| Привет всем! Столкнулся с проблемой.
Создаю скриптом файл на сервере, нужно задать определенную кодировку этому файлу,
делаю так:
mb_convert_encoding($text, "UTF-8", "моя_кодировка");
Если в скрипте выводить результат работы функции, то кодировка меняется.
Но при записи в файл кодировка всё равно не меняется. Что подскажете?
Спасибо! | |
|
|
|
|
|
|
|
для: morkovkin
(25.11.2007 в 17:46)
| | >...нужно задать определенную кодировку этому файлу
так не может быть :)) Это как раз просто значит, что в файл будут вводиться данные в необходимой кодировке... | |
|
|
|
|
|
|
|
для: ddhvvn
(25.11.2007 в 18:42)
| | Ну не получается. Блокнотом открываю всё норм, если открываю опять же штатным WordPad, то кракозяблики видны. Через блокнот пересохраняю в нужной мне кодировке и тогда всё отлично! Я уже не знаю, что делать...
Мне нужно это для айпода. Он читает только файлы по 4кб и в кодировке UTF-8. По 4 кб разбивается, но кодировку задать не получается :) | |
|
|
|
|
|
|
|
для: morkovkin
(25.11.2007 в 18:47)
| | Задать кодировку файла нельзя. Это нигде не записывается, если не считать BOM.
Приведите пример кода, когда в файл записывается не то, что надо. Я надеюсь, записываете результат работы функции? | |
|
|
|
|
|
|
|
для: Unkind
(25.11.2007 в 19:54)
| |
<?php
$filename = "111.txt"; // Исходный, большой файл.
$dir = "kniga"; // Как назвать папку для файла
mkdir($dir, 0777); // Создаём папку
$piece = 400000; // Размер частей
$fp2 = fopen($filename, "r");
$fp22 = fread($fp2, filesize($filename));
fclose($fp2);
// Считаем
$count = (int)filesize($filename)/$piece;
if((float)(filesize($filename)/$piece) - $count != 0) $count++;
for($i=0; $i<$count; ++$i)
{
$part = substr($fp22,$i*$piece,$piece);
$part2 = mb_convert_encoding($part, "UTF-8", "UTF-8"); // Меняем кодировку
$fp = fopen("$dir/".$i.".txt","w");
fwrite($fp,$part2);
fclose($fp);
}
?>
|
Прошу прощения за названия переменных :)
В $part передаётся нужный кусок текста, который и нужно сохранить. | |
|
|
|
|
|
|
|
для: morkovkin
(25.11.2007 в 20:04)
| | Стоп! Я что-то пропустил... =))
А в исходном файле данные в какой кодировке? | |
|
|
|
|
|
|
|
для: ddhvvn
(25.11.2007 в 20:06)
| | Точно :) Залить на форум? :) | |
|
|
|
|
|
|
|
для: morkovkin
(25.11.2007 в 20:04)
| | UTF-8 на UTF-8? И че, не меняется? | |
|
|
|
|
|
|
|
для: Unkind
(25.11.2007 в 20:07)
| | Не а.. в том то и дело..
Если разбивать файл в UTF-8 без смены кодировки, то первый файл ещё читабелен в блокноте, а остальные вообще теряют кодировку на кракозяблики.
Поэтому и хочу зафиксировать кодировку. | |
|
|
|
|
|
|
|
для: morkovkin
(25.11.2007 в 20:10)
| | Хм.. а файлик-то точно текстовый? | |
|
|
|
|
|
|
|
для: morkovkin
(25.11.2007 в 20:10)
| | Это была ирония. Вы ничего с кодировкой не делаете. Это можно сравнить, допустим, с заменой "1" на "1".
А файлики могут портиться, так как UTF-8 - многобайтовая кодировка. substr() применять нельзя. | |
|
|
|
|
|
|
|
для: Unkind
(25.11.2007 в 20:16)
| | Так, значит если без иронии, то выход то есть? Что можете предложить? :) | |
|
|
|
|
|
|
|
для: morkovkin
(25.11.2007 в 20:21)
| | Буду у компа - напишу. | |
|
|
|
|
|
|
|
для: Unkind
(25.11.2007 в 20:28)
| | Ок, спасибо, буду ждать. | |
|
|
|
|
|
|
|
для: morkovkin
(25.11.2007 в 20:28)
| | Я бы сделал что-то вроде
<?php
set_time_limit(1);
function reduce_utf8($s)
{
for($i = strlen( $s ) - 1, $l = 0; $i > 0; $i--)
{
$ord = ord( $s[$i] );
if( $ord < 0x80 )
{
if( $l == 0 )
{
return $s;
}
else
{
return false;
}
}
if( $ord == 0xFE || $ord == 0xFF )
{
/* "The octet values FE and FF never appear", RFC 2279 */
return false;
}
if( $l > 5 )
{
/* Too long character */
return false;
}
if( $ord <= 0xBF )
{
$l++;
}
else
{
break;
}
}
return substr($s, 0, $i);
}
$filename = 'text.txt';
$dirname = 'book';
$encoding = 'UTF-8';
if( !is_dir( $dirname ) )
{
if( !mkdir($dirname, 0777) )
{
die( 'Could not mkdir' );
}
}
$piece = 4096;
$total = filesize($filename);
$frh = fopen($filename, 'rb');
for($offset = 0, $i = 1; !feof($frh); $i++)
{
fseek($frh, $offset, SEEK_SET);
$fwh = fopen($dirname . '/' . $i . '.txt', 'wb');
$buffer = fread($frh, $piece);
$buffer = reduce_utf8($buffer);
if( $buffer === false )
{
echo "Incorrect encoding";
break;
}
fwrite($fwh, $buffer);
fclose($fwh);
$offset = ftell($frh) - ($piece - strlen( $buffer ));
}
fclose($frh);
?>
|
P.S. Кстати, 4 килобайта - 4096 байт, а не 40000. | |
|
|
|
|
|
|
|
для: Unkind
(25.11.2007 в 21:40)
| | Спасибо! Про килобайты знаю :) Это просто у меня там файл весит 1.2мб.. и для теста я его делил на 3 части..
Но проблема осталась, кодировка файлов также не меняется. Поменялась только на первый созданный файл... При открытии блокнотом, все файлы читабельны, но при открытии WordPad сразу всё становится видно. | |
|
|
|
|
|
|
|
для: morkovkin
(25.11.2007 в 22:31)
| | Вы же сами сказали, "Он читает только файлы по 4кб и в кодировке UTF-8". Что Вы хотите? | |
|
|
|
|
|
|
|
для: Unkind
(25.11.2007 в 22:46)
| | Вы про что? Я это писал про айпод - это правда. Но для теста, чтоб не нагружать машину, делать ради теста почти каждую минутут по 300 файликов, я просто там поменял размер, чтоб быстро делал 3 файла. И проверял через ВордПад кодировку..
Вобщем, кодировка не меняется, что делать то? :)
p.s. Ааа, тоесть я там хотел сказать, что UTF-8 делается только для первого файла, для остальных делается какая-то другая.. не знаю - какая...
Вот пример:
Таким образом, эксплуатируя уязвимость типа SQL-инъекция в MySQL-
сервере, нападающий может
Но через блокнот, он видится, как нормальный файл. | |
|
|
|
|
|
|
|
для: morkovkin
(25.11.2007 в 22:56)
| | Еще раз: в какой кодировке Вы хотите получить текст? Меня только это интересует. Вы говорите, что проверяете через WordPad кодировку. Какую ожидаете увидеть?
> Вот пример:
Это UTF-8. WordPad его не понимает (у меня). А если у Вас понимает ТОЛЬКО первый файл, то там BOM. Проверьте на Вашем iPod, а не в WordPad. | |
|
|
|
|
 5.1 Кб |
|
|
для: Unkind
(25.11.2007 в 22:59)
| | Нет, всё-таки ВордПад всё правильно показывает.
Первый файл открывает правильно, всё читается, а остальные нет.
Прикрепил архив. | |
|
|
|
|
|
|
|
для: morkovkin
(25.11.2007 в 23:02)
| | Простите, у Вас просто редакторы галимые :))) Я же говорю, всё нормально.
OK, добавляйте BOM:
<?php
set_time_limit(1);
function reduce_utf8($s)
{
for($i = strlen( $s ) - 1, $l = 0; $i > 0; $i--)
{
$ord = ord( $s[$i] );
if( $ord < 0x80 && $l == 0 )
{
return $s;
}
if( $ord == 0xFE || $ord == 0xFF )
{
/* "The octet values FE and FF never appear", RFC 2279 */
return false;
}
if( $l > 5 )
{
/* Too long character */
return false;
}
if( $ord <= 0xBF )
{
$l++;
}
else
{
break;
}
}
return substr($s, 0, $i);
}
$filename = 'text.txt';
$dirname = 'book';
if( !is_dir( $dirname ) )
{
if( !mkdir($dirname, 0777) )
{
die( 'Could not mkdir' );
}
}
$piece = 4096;
$total = filesize($filename);
$frh = fopen($filename, 'rb');
$piece -= 3;
for($offset = 0, $i = 1; !feof($frh); $i++)
{
fseek($frh, $offset, SEEK_SET);
$fwh = fopen($dirname . '/' . $i . '.txt', 'wb');
$buffer = fread($frh, $piece);
$buffer = reduce_utf8($buffer);
if( $buffer === false )
{
echo 'Incorrect encoding';
break;
}
fwrite($fwh, substr($buffer, 0, 3) != "\xEF\xBB\xBF" ? "\xEF\xBB\xBF" . $buffer : $buffer);
fclose($fwh);
$offset = ftell($frh) - ($piece - strlen( $buffer ));
}
fclose($frh);
?>
|
| |
|
|
|
|
|
|
|
для: Unkind
(25.11.2007 в 23:14)
| | При чёт здесь редактор то?? Айпод тоже галимый редактор??
Всё, теперь всё ок :) Спасибо огромное, сейчас буду разбираться в коде :)
Ещё раз большое спасибо, оч помогли!! | |
|
|
|
|
|
|
|
для: morkovkin
(25.11.2007 в 23:17)
| | > Айпод тоже галимый редактор??
Ну раз он не может автоматически определить, что это UTF-8, а ждет только BOM, то это существенный недостаток. Даже Блокнот его уделал. А это, скажите, не показатель? | |
|
|
|
|
|
|
|
для: Unkind
(25.11.2007 в 23:22)
| | Так я чё-то говорю? :) В айподе существенный недостаток того, что вообще файлы только текстовые и только по 4кб.. Очень не удобно и т.д.... и т.п...
Но здесь смысл в другом - главное итог :) А итог отличный, теперь удобно книжки для айподика делать :) | |
|
|
|