|
 19 Кб |
|
| Написала модуль для Друпала(кодировка - utf-8). Код большой, поэтому приводить его нет смысла.
Внутри модуля к каждому материалу прилагается ссылка - "Скачать"- пользователь может загрузить себе файл. Но!
Нажимаю на ссылку - идет загрузка, открываю файл, который скачался - а внутри вместо русских букв пустое место (см. в аттач). Я в шоке.
Если использовать скрипт загрузки файла вне Друпала, все нормально грузится. В чем здесь дело? | |
|
|
|
|
|
|
|
для: Лена
(05.04.2009 в 23:15)
| | вообще-то внутри файла куча русского текста в кодировке windows-1251.
Правда, он почему-то начинается с Byte Order Mark .
Корректно читаемым, понятное дело, такой файл считаться не может. | |
|
|
|
|
|
|
|
для: Trianon
(05.04.2009 в 23:24)
| | как же мне сделать, чтобы этот русский текст по нормальному отображался? | |
|
|
|
|
|
|
|
для: Лена
(06.04.2009 в 12:03)
| | откусить от него первые три байта. Тогда будет нормально отображаться как текст в ansi-кодировке.
Либо перекодировать весь текст кроме первых трех байт из windows-1251 в utf-8 . Тогда будет нормально отображаться как текст в кодировке utf-8
Из формулировки задачи неясно, что именно требуется.
Русский текст по нормальному бывает представлен разными способами. | |
|
|
|
|
|
|
|
для: Trianon
(06.04.2009 в 12:46)
| | Странно еще то, что на работе если запускаю скрипт, файл скачивается нормально, такая ерунда только дома, хотя данные и настройка локалхоста везде и там, и там одинаковые.
>Из формулировки задачи неясно, что именно требуется.
мне нужно, чтобы текст был читабельным
Тексты перекодировала в utf-8. Теперь все нормально. Спасибо. | |
|
|
|
|
|
|
|
для: Лена
(06.04.2009 в 22:21)
| | чтобы текст был читабельным, его выводят в окно браузера, указывая при этом кодировку.
Тогда брааузер его и показывает.
У Вас же скрипт, как я понял, отдает файл.
Каким этот файл должен быть?
И откуда взялся BOM?
Не святым же духом он там оказался? | |
|
|
|
|
|
|
|
для: 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?
откуда я знаю, где он там взялся? я его туда не ставила. | |
|
|
|
|
|
|
|
для: Лена
(06.04.2009 в 23:08)
| | так если скрипт один и тот же ( и выдает один и тот же результат) , то один заголовок к нему подходит, а другой нет.
квадратик всё ж я бы поискал... | |
|
|
|
|
|
|
|
для: Trianon
(06.04.2009 в 23:25)
| | >квадратик всё ж я бы поискал...
я бы тоже поискала, если бы знала где. Мне кажется, это Друпал его как-то лепит, наверное, где-то в ядре есть функция, которая любой текст хочет прочитать как utf-8. | |
|
|
|
|
|
|
|
для: Лена
(06.04.2009 в 23:44)
| | его можно понять.
собственно, преобразование в utf-8 это вызов одной функции
$text = iconv('windows-1251', 'utf-8', $text);
|
| |
|
|
|
|
|
|
|
для: 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);
}
?>
|
| |
|
|
|
|
|
|
|
для: Лена
(07.04.2009 в 13:03)
| | эта функция ничего не преобразует. Она только тестирует символы на принадлежность utf8 | |
|
|
|
|
|
|
|
для: 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;
}
|
?>
Только откуда пустой квадратик тогда берется? | |
|
|
|
|
|
|
|
для: Лена
(07.04.2009 в 17:27)
| | квадратик пусть будет.
Если квадратик соответствует кодировке - это даже хорошо. | |
|
|
|