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

Форум PHP

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

 

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

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

тема: Вместо русских букв - пусто
 
 автор: Лена   (05.04.2009 в 23:15)   письмо автору
19 Кб
 
 

Написала модуль для Друпала(кодировка - utf-8). Код большой, поэтому приводить его нет смысла.
Внутри модуля к каждому материалу прилагается ссылка - "Скачать"- пользователь может загрузить себе файл. Но!
Нажимаю на ссылку - идет загрузка, открываю файл, который скачался - а внутри вместо русских букв пустое место (см. в аттач). Я в шоке.
Если использовать скрипт загрузки файла вне Друпала, все нормально грузится. В чем здесь дело?

  Ответить  
 
 автор: Trianon   (05.04.2009 в 23:24)   письмо автору
 
   для: Лена   (05.04.2009 в 23:15)
 

вообще-то внутри файла куча русского текста в кодировке windows-1251.
Правда, он почему-то начинается с Byte Order Mark .
Корректно читаемым, понятное дело, такой файл считаться не может.

  Ответить  
 
 автор: Лена   (06.04.2009 в 12:03)   письмо автору
 
   для: Trianon   (05.04.2009 в 23:24)
 

как же мне сделать, чтобы этот русский текст по нормальному отображался?

  Ответить  
 
 автор: Trianon   (06.04.2009 в 12:46)   письмо автору
 
   для: Лена   (06.04.2009 в 12:03)
 

откусить от него первые три байта. Тогда будет нормально отображаться как текст в ansi-кодировке.
Либо перекодировать весь текст кроме первых трех байт из windows-1251 в utf-8 . Тогда будет нормально отображаться как текст в кодировке utf-8

Из формулировки задачи неясно, что именно требуется.
Русский текст по нормальному бывает представлен разными способами.

  Ответить  
 
 автор: Лена   (06.04.2009 в 22:21)   письмо автору
 
   для: Trianon   (06.04.2009 в 12:46)
 

Странно еще то, что на работе если запускаю скрипт, файл скачивается нормально, такая ерунда только дома, хотя данные и настройка локалхоста везде и там, и там одинаковые.

>Из формулировки задачи неясно, что именно требуется.
мне нужно, чтобы текст был читабельным

Тексты перекодировала в utf-8. Теперь все нормально. Спасибо.

  Ответить  
 
 автор: TrianoN   (06.04.2009 в 22:27)   письмо автору
 
   для: Лена   (06.04.2009 в 22:21)
 

чтобы текст был читабельным, его выводят в окно браузера, указывая при этом кодировку.
Тогда брааузер его и показывает.

У Вас же скрипт, как я понял, отдает файл.
Каким этот файл должен быть?

И откуда взялся BOM?
Не святым же духом он там оказался?

  Ответить  
 
 автор: Лена   (06.04.2009 в 23:08)   письмо автору
 
   для: TrianoN   (06.04.2009 в 22:27)
 

1. Сохраняю текст в utf-8
перед выводом текста в броузер прописываю заголовки header("Content-type: text/html; charset=utf-8");
запускаю скрипт, результат - текст скачивается как надо, но перед первой буквой - непонятный квадратик. Я так поняла, это и есть BOM.

2. Сохраняю текст в ansi
прописываю заголовки header("Content-type: text/html; charset=Windows-1251");
запускаю скрипт, результат - пусто (одни цифры)

>И откуда взялся BOM?
откуда я знаю, где он там взялся? я его туда не ставила.

  Ответить  
 
 автор: Trianon   (06.04.2009 в 23:25)   письмо автору
 
   для: Лена   (06.04.2009 в 23:08)
 

так если скрипт один и тот же ( и выдает один и тот же результат) , то один заголовок к нему подходит, а другой нет.

квадратик всё ж я бы поискал...

  Ответить  
 
 автор: Лена   (06.04.2009 в 23:44)   письмо автору
 
   для: Trianon   (06.04.2009 в 23:25)
 

>квадратик всё ж я бы поискал...
я бы тоже поискала, если бы знала где. Мне кажется, это Друпал его как-то лепит, наверное, где-то в ядре есть функция, которая любой текст хочет прочитать как utf-8.

  Ответить  
 
 автор: Trianon   (07.04.2009 в 00:24)   письмо автору
 
   для: Лена   (06.04.2009 в 23:44)
 

его можно понять.

собственно, преобразование в utf-8 это вызов одной функции
$text  = iconv('windows-1251', 'utf-8', $text);

  Ответить  
 
 автор: Лена   (07.04.2009 в 13:03)   письмо автору
 
   для: Trianon   (07.04.2009 в 00:24)
 

Нашла. И без iconv. Это в bootstrap.inc - файл, который загружает все основные функции.

<?php
/**
 * Checks whether a string is valid UTF-8.
 *
 * All functions designed to filter input should use drupal_validate_utf8
 * to ensure they operate on valid UTF-8 strings to prevent bypass of the
 * filter.
 *
 * When text containing an invalid UTF-8 lead byte (0xC0 - 0xFF) is presented
 * as UTF-8 to Internet Explorer 6, the program may misinterpret subsequent
 * bytes. When these subsequent bytes are HTML control characters such as
 * quotes or angle brackets, parts of the text that were deemed safe by filters
 * end up in locations that are potentially unsafe; An onerror attribute that
 * is outside of a tag, and thus deemed safe by a filter, can be interpreted
 * by the browser as if it were inside the tag.
 *
 * This function exploits preg_match behaviour (since PHP 4.3.5) when used
 * with the u modifier, as a fast way to find invalid UTF-8. When the matched
 * string contains an invalid byte sequence, it will fail silently.
 *
 * preg_match may not fail on 4 and 5 octet sequences, even though they
 * are not supported by the specification.
 *
 * The specific preg_match behaviour is present since PHP 4.3.5.
 *
 * @param $text
 *   The text to check.
 * @return
 *   TRUE if the text is valid UTF-8, FALSE if not.
 */
function drupal_validate_utf8($text) {
  if (
strlen($text) == 0) {
    return 
TRUE;
  }
  return (
preg_match('/^./us'$text) == 1);
}
?>

  Ответить  
 
 автор: Trianon   (07.04.2009 в 14:43)   письмо автору
 
   для: Лена   (07.04.2009 в 13:03)
 

эта функция ничего не преобразует. Она только тестирует символы на принадлежность utf8

  Ответить  
 
 автор: Лена   (07.04.2009 в 17:27)   письмо автору
 
   для: Trianon   (07.04.2009 в 14:43)
 

Нашла. Вот эта преобразует. В отдельном файле была - unicode.inc, я его сразу не заметила

<?php
/**
 * Convert data to UTF-8
 * Requires the iconv, GNU recode or mbstring PHP extension.
 * @param $data
 *   The data to be converted.
 * @param $encoding
 *   The encoding that the data is in
 * @return
 *   Converted data or FALSE.
 */
function drupal_convert_to_utf8($data$encoding) {
  if (
function_exists('iconv')) {
    
$out = @iconv($encoding'utf-8'$data);
  }
  else if (
function_exists('mb_convert_encoding')) {
    
$out = @mb_convert_encoding($data'utf-8'$encoding);
  }
  else if (
function_exists('recode_string')) {
    
$out = @recode_string($encoding .'..utf-8'$data);
  }
  else {
    
watchdog('php''Unsupported encoding %s. Please install iconv, GNU recode or mbstring for PHP.', array('%s' => $encoding), WATCHDOG_ERROR);
    return 
FALSE;
  }

  return 
$out;
}

?>
Только откуда пустой квадратик тогда берется?

  Ответить  
 
 автор: Trianon   (07.04.2009 в 17:35)   письмо автору
 
   для: Лена   (07.04.2009 в 17:27)
 

квадратик пусть будет.
Если квадратик соответствует кодировке - это даже хорошо.

  Ответить  
Rambler's Top100
вверх

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