Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр 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($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 передаётся нужный кусок текста, который и нужно сохранить.

   
 
 автор: 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 == 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.

   
 
 автор: 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 == 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); 
?>

   
 
 автор: 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 Яндекс.Метрика Яндекс цитирования