Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Задать кодировку созданному файлу.
 
 автор: morkovkin   (25.11.2007 в 17:46)   письмо автору
 
 

Привет всем! Столкнулся с проблемой.

Создаю скриптом файл на сервере, нужно задать определенную кодировку этому файлу,
делаю так:

mb_convert_encoding($text, "UTF-8", "моя_кодировка");

Если в скрипте выводить результат работы функции, то кодировка меняется.
Но при записи в файл кодировка всё равно не меняется. Что подскажете?

Спасибо!

   
 
 автор: ddhvvn   (25.11.2007 в 18:42)   письмо автору
 
   для: morkovkin   (25.11.2007 в 17:46)
 

>...нужно задать определенную кодировку этому файлу

так не может быть :)) Это как раз просто значит, что в файл будут вводиться данные в необходимой кодировке...

   
 
 автор: morkovkin   (25.11.2007 в 18:47)   письмо автору
 
   для: ddhvvn   (25.11.2007 в 18:42)
 

Ну не получается. Блокнотом открываю всё норм, если открываю опять же штатным WordPad, то кракозяблики видны. Через блокнот пересохраняю в нужной мне кодировке и тогда всё отлично! Я уже не знаю, что делать...
Мне нужно это для айпода. Он читает только файлы по 4кб и в кодировке UTF-8. По 4 кб разбивается, но кодировку задать не получается :)

   
 
 автор: Unkind   (25.11.2007 в 19:54)   письмо автору
 
   для: morkovkin   (25.11.2007 в 18:47)
 

Задать кодировку файла нельзя. Это нигде не записывается, если не считать BOM.

Приведите пример кода, когда в файл записывается не то, что надо. Я надеюсь, записываете результат работы функции?

   
 
 автор: morkovkin   (25.11.2007 в 20:04)   письмо автору
 
   для: Unkind   (25.11.2007 в 19:54)
 


<?php
$filename 
"111.txt"// Исходный, большой файл.
$dir "kniga"// Как назвать папку для файла
mkdir($dir0777); // Создаём папку
$piece 400000// Размер частей
$fp2 fopen($filename"r"); 
$fp22 fread($fp2filesize($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 передаётся нужный кусок текста, который и нужно сохранить.

   
 
 автор: ddhvvn   (25.11.2007 в 20:06)   письмо автору
 
   для: morkovkin   (25.11.2007 в 20:04)
 

Стоп! Я что-то пропустил... =))

А в исходном файле данные в какой кодировке?

   
 
 автор: morkovkin   (25.11.2007 в 20:11)   письмо автору
 
   для: ddhvvn   (25.11.2007 в 20:06)
 

Точно :) Залить на форум? :)

   
 
 автор: Unkind   (25.11.2007 в 20:07)   письмо автору
 
   для: morkovkin   (25.11.2007 в 20:04)
 

UTF-8 на UTF-8? И че, не меняется?

   
 
 автор: morkovkin   (25.11.2007 в 20:10)   письмо автору
 
   для: Unkind   (25.11.2007 в 20:07)
 

Не а.. в том то и дело..

Если разбивать файл в UTF-8 без смены кодировки, то первый файл ещё читабелен в блокноте, а остальные вообще теряют кодировку на кракозяблики.
Поэтому и хочу зафиксировать кодировку.

   
 
 автор: ddhvvn   (25.11.2007 в 20:11)   письмо автору
 
   для: morkovkin   (25.11.2007 в 20:10)
 

Хм.. а файлик-то точно текстовый?

   
 
 автор: Unkind   (25.11.2007 в 20:16)   письмо автору
 
   для: morkovkin   (25.11.2007 в 20:10)
 

Это была ирония. Вы ничего с кодировкой не делаете. Это можно сравнить, допустим, с заменой "1" на "1".

А файлики могут портиться, так как UTF-8 - многобайтовая кодировка. substr() применять нельзя.

   
 
 автор: morkovkin   (25.11.2007 в 20:21)   письмо автору
 
   для: Unkind   (25.11.2007 в 20:16)
 

Так, значит если без иронии, то выход то есть? Что можете предложить? :)

   
 
 автор: Unkind   (25.11.2007 в 20:28)   письмо автору
 
   для: morkovkin   (25.11.2007 в 20:21)
 

Буду у компа - напишу.

   
 
 автор: morkovkin   (25.11.2007 в 20:28)   письмо автору
 
   для: Unkind   (25.11.2007 в 20:28)
 

Ок, спасибо, буду ждать.

   
 
 автор: Unkind   (25.11.2007 в 21:40)   письмо автору
 
   для: 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 == )
            {
                return 
$s;
            }
            else
            {
                return 
false;
            } 
        } 

        if( 
$ord == 0xFE || $ord == 0xFF 
        { 
            
/* "The octet values FE and FF never appear", RFC 2279 */ 

            
return false
        } 

        if( 
$l 
        { 
            
/* Too long character */ 

            
return false
        } 

        if( 
$ord <= 0xBF 
        { 
            
$l++; 
        } 
        else 
        { 
            break; 
        } 
    } 

    return 
substr($s0$i); 


$filename 'text.txt'
$dirname 'book'
$encoding 'UTF-8'

if( !
is_dir$dirname ) ) 

    if( !
mkdir($dirname0777) ) 
    { 
        die( 
'Could not mkdir' ); 
    } 


$piece 4096

$total filesize($filename); 

$frh fopen($filename'rb'); 

for(
$offset 0$i 1; !feof($frh); $i++) 

    
fseek($frh$offsetSEEK_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.

   
 
 автор: morkovkin   (25.11.2007 в 22:31)   письмо автору
 
   для: Unkind   (25.11.2007 в 21:40)
 

Спасибо! Про килобайты знаю :) Это просто у меня там файл весит 1.2мб.. и для теста я его делил на 3 части..
Но проблема осталась, кодировка файлов также не меняется. Поменялась только на первый созданный файл... При открытии блокнотом, все файлы читабельны, но при открытии WordPad сразу всё становится видно.

   
 
 автор: Unkind   (25.11.2007 в 22:46)   письмо автору
 
   для: morkovkin   (25.11.2007 в 22:31)
 

Вы же сами сказали, "Он читает только файлы по 4кб и в кодировке UTF-8". Что Вы хотите?

   
 
 автор: morkovkin   (25.11.2007 в 22:56)   письмо автору
 
   для: Unkind   (25.11.2007 в 22:46)
 

Вы про что? Я это писал про айпод - это правда. Но для теста, чтоб не нагружать машину, делать ради теста почти каждую минутут по 300 файликов, я просто там поменял размер, чтоб быстро делал 3 файла. И проверял через ВордПад кодировку..

Вобщем, кодировка не меняется, что делать то? :)

p.s. Ааа, тоесть я там хотел сказать, что UTF-8 делается только для первого файла, для остальных делается какая-то другая.. не знаю - какая...
Вот пример:
Таким образом, эксплуатируя уязвимость типа SQL-инъекция в MySQL-
сервере, нападающий может
Но через блокнот, он видится, как нормальный файл.

   
 
 автор: Unkind   (25.11.2007 в 22:59)   письмо автору
 
   для: morkovkin   (25.11.2007 в 22:56)
 

Еще раз: в какой кодировке Вы хотите получить текст? Меня только это интересует. Вы говорите, что проверяете через WordPad кодировку. Какую ожидаете увидеть?

> Вот пример:
Это UTF-8. WordPad его не понимает (у меня). А если у Вас понимает ТОЛЬКО первый файл, то там BOM. Проверьте на Вашем iPod, а не в WordPad.

   
 
 автор: morkovkin   (25.11.2007 в 23:02)   письмо автору
5.1 Кб
 
   для: Unkind   (25.11.2007 в 22:59)
 

Нет, всё-таки ВордПад всё правильно показывает.
Первый файл открывает правильно, всё читается, а остальные нет.
Прикрепил архив.

   
 
 автор: Unkind   (25.11.2007 в 23:14)   письмо автору
 
   для: 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 == 
        { 
            return 
$s
        } 

        if( 
$ord == 0xFE || $ord == 0xFF 
        { 
            
/* "The octet values FE and FF never appear", RFC 2279 */ 

            
return false
        } 

        if( 
$l 
        { 
            
/* Too long character */ 

            
return false
        } 

        if( 
$ord <= 0xBF 
        { 
            
$l++; 
        } 
        else 
        { 
            break; 
        } 
    }

    return 
substr($s0$i); 


$filename 'text.txt'
$dirname 'book'

if( !
is_dir$dirname ) )

    if( !
mkdir($dirname0777) )
    { 
        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$offsetSEEK_SET);

    
$fwh fopen($dirname '/' $i '.txt''wb');
    
$buffer fread($frh$piece);
    
$buffer reduce_utf8($buffer);

    if( 
$buffer === false )
    { 
        echo 
'Incorrect encoding';

        break;
    }

    
    
fwrite($fwhsubstr($buffer03) != "\xEF\xBB\xBF" "\xEF\xBB\xBF" $buffer $buffer); 
    
fclose($fwh); 

    
$offset ftell($frh) - ($piece strlen$buffer )); 


fclose($frh); 
?>

   
 
 автор: morkovkin   (25.11.2007 в 23:17)   письмо автору
 
   для: Unkind   (25.11.2007 в 23:14)
 

При чёт здесь редактор то?? Айпод тоже галимый редактор??
Всё, теперь всё ок :) Спасибо огромное, сейчас буду разбираться в коде :)
Ещё раз большое спасибо, оч помогли!!

   
 
 автор: Unkind   (25.11.2007 в 23:22)   письмо автору
 
   для: morkovkin   (25.11.2007 в 23:17)
 

> Айпод тоже галимый редактор??
Ну раз он не может автоматически определить, что это UTF-8, а ждет только BOM, то это существенный недостаток. Даже Блокнот его уделал. А это, скажите, не показатель?

   
 
 автор: morkovkin   (25.11.2007 в 23:33)   письмо автору
 
   для: Unkind   (25.11.2007 в 23:22)
 

Так я чё-то говорю? :) В айподе существенный недостаток того, что вообще файлы только текстовые и только по 4кб.. Очень не удобно и т.д.... и т.п...
Но здесь смысл в другом - главное итог :) А итог отличный, теперь удобно книжки для айподика делать :)

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования