Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как подружить is_file и UTF-8 
V
    Опции темы
TName
Дата 7.2.2010, 02:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 16.3.2008

Репутация: нет
Всего: нет



Итак...
Ситуация такая: существует база данных в кодировке UTF-8. В базе лежат пути к файлам. is_file() даёт true на латинницу и false на любые другие символы, хотя файлы существуют, и имя их хранится верно.
Задача: проверить существование файла с именем, содержащим unicode-символы.
Решение: ...пока отсутствует...
PM MAIL   Вверх
bars80080
Дата 7.2.2010, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



а file_exists() что показывает?
PM MAIL WWW   Вверх
TName
Дата 7.2.2010, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 16.3.2008

Репутация: нет
Всего: нет



Если честно, это вопрос был из разряда "вдруг кто-нибудь знает?". Вобще, для русских символов и для задачи вцелом достаточно cp1251 "и никаких гвоздей". Просто стало интересно, что будет, если имя файла,например, арабской вязью сделать. Поэтому пока сам сильно не углублялся в исследования. Позже отпишусь о результатах эксперимента.
PM MAIL   Вверх
bars80080
Дата 7.2.2010, 14:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



вообще-то ничего, и я лично не сталкивался с проблемами. nix сервер позволяет создавать файлы с любыми именами в любой кодировке. небольшие заморочки наблюдаются на винде, но только в том месте, когда не настроена кодировка. то есть на каком-то этапе происходит перекодирование имени, а впоследствии его не удаётся воспроизвести
PM MAIL WWW   Вверх
TName
Дата 8.2.2010, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 16.3.2008

Репутация: нет
Всего: нет



Вот что у меня получается.

Код страницы (сам файл страницы тоже в UTF-8 без BOM):

Код

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
    <title>FileName test</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <style type="text/css">
        p {font-family: Tahoma, Arial; font-size: 10pt; margin: 0px; padding: 0px;}
    </style>
</head>
<body>
    <?php $filename = "D:\\Файл.txt"; ?>
    <p>is_file() returns: <?php var_dump(is_file($filename)); ?></p>
    <p>file_exists() returns: <?php var_dump(file_exists($filename)); ?></p>
    <p>filesize() returns: <?php var_dump(filesize($filename)); ?></p>
    <p>filetype() returns: <?php var_dump(filetype($filename)); ?></p>
    <p>filectime() returns: <?php var_dump(filectime($filename)); ?></p>
</body>
</html>


вот результат:

Код

is_file() returns: bool(false) 

file_exists() returns: bool(false) 

filesize() returns: bool(false) 

filetype() returns: bool(false) 

filectime() returns: bool(false)


Окружение:

PHP
Version    5.2.10
 
Web Server
Server Name    127.0.0.1
Server Software    Apache/2.2.12 (Win32) mod_ssl/2.2.12 OpenSSL/0.9.8k
OS Version    Windows XP

Кодировки в винде включены чуть ли не все...

Где грабли? smile 
PM MAIL   Вверх
bars80080
Дата 8.2.2010, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



дык, я это ж винда. у неё имя файла по определению в cp1251. потому он и не находит твоё "D:\\Файл.txt";  - это ведь в utf-8, то есть совсем другой кодовый набор

попробуй так:

Код

        $f = 'D:/файл.txt';
        $f = iconv('utf-8', 'cp1251', $f);
        $fp = fopen($f, 'r');
        $r = fread($fp, 4096); fclose($fp);
        $r = iconv('cp1251', 'utf-8', $r); // обычно блокнот пишет в cp1251, если не установлено иное.
        var_dump($r);


Добавлено через 43 секунды
и почему d:\\ ?
PM MAIL WWW   Вверх
TName
Дата 8.2.2010, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 16.3.2008

Репутация: нет
Всего: нет



Спасибо, разъяснили smile

Суть действительно в кодировке. Но не только.
Из корня D: фаил из-за прав был недоступен.
Положил "Файл.txt" рядом со скриптом (или в дочерние папки от корня хоста) и перекодировал iconv("UTF-8", "Windows-1251", $f) - работатет.

Скрипт немного изменился:
Код

    <?php
        $filename = "d:/path/to/host/root/files/اً للكتب بعنوا.txt";
        echo "<p>".$filename."</p>";
        $filename = iconv("UTF-8", "Windows-1251", $filename);
        echo "<p>".$filename."</p>";
    ?>



Что занимательно, результат от имени файла с арабской вязью следующий:

Код

d:/path/to/host/root/files/اً للكتب بعنوا.txt

Notice: iconv() [function.iconv]: Detected an illegal character in input string in D:\path\to\host\root\isfile.php on line 14

d:/path/to/host/root/files/

is_file() returns: bool(false) 

file_exists() returns: bool(true) 

filesize() returns: int(0) 

filetype() returns: string(3) "dir" 

filectime() returns: int(1265585783)


Т.е. это папка теперь :(

Двойной слэш - это экранирование бэк-слэша в строке (С ними тоже работает).

Т.е. теперь, чтобы работало везде, надо детектить ОС и втыкать перекодирование, если надо?

Это сообщение отредактировал(а) TName - 8.2.2010, 17:38
PM MAIL   Вверх
TName
Дата 8.2.2010, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 16.3.2008

Репутация: нет
Всего: нет



ну да, логично, чОрт возьми.... Конечно папка. Имя файла-то отпало в переменной. Остался только путь до папки.
И что теперь? Винду выкидывать? (Вопрос риторический).
PM MAIL   Вверх
bars80080
Дата 8.2.2010, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



а как тебе удалось создать файл с арабской вязью в имене? непомню таких символов в cp1251
PM MAIL WWW   Вверх
TName
Дата 8.2.2010, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 16.3.2008

Репутация: нет
Всего: нет



А создал очень просто smile
Скопировал часть текста с арабской версии сайта МВД России и вставил в текстовое поле при переименовании файла.

В том-то и секрет, что винда с юникодом в принципе дружит. Но вот кто кого не понимает (апач или винда) - вопрос.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1170 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.