Кодировка

Added by Георгий Филатов over 1 year ago

В демо работает правильно.
Проблема у меня но не могу разобраться в каком месте.

1. Браузер и его версию - ff 3.5.15
2. Операционную систему на которой работает elFinder - centos 5, php 5.1.6
3. Текст ошибки (если такая имеется) - не имеется.
4. Какие действия вызвали ошибку - загрузка файла на сервер.

Проблема в следующем: если имя файла начинается с англ. букв(ы), то имя в менеджере отображается целиком, в том числе, видно все русские буквы.
Если имя начинается с русской буквы, то все русские обрезаются и имя в мнеджере отображется только из англ. букв.
Если имя файла только из русских букв то после аплоада оно заменяется просто на files.
С именами директорий тоже самое. Слить файлы с сервера есс-но не получается.
В файловой системе на сервере после аплоада все имена сохраняются правильно.
Везде локаль - utf8, браузер настроен показывать в utf8.
В каком месте копать?
Спасибо.

upd
забыл добавить, что если отображаются файлы и директории не правильно, но при этом они успешно удаляются через менеджер.

screenshot1.png (12.6 kB)

screenshot2.png (5.7 kB)


Replies (6)

RE: Кодировка - Added by Troex Nevelin over 1 year ago

Очень необычный глюк, а можете привести вывод JSON.

Единственное что могу предположить - у вас на сервере установлена локаль не utf-8 и это каким-то образом влияет на поведение php, это были типичные проблемы во времена php4... странно что в php5 у вас такое.

RE: Кодировка - Added by Георгий Филатов over 1 year ago

насчет того что не utf8 локаль - это первое что я подумал.
судя по тому что дистр ставился "как есть" и я ничего в настройках не менял, то предположил что юникод настроен поумолчанию.
тем более что все современные юниксы вроде как полностью юникодные из коробки. юникодные сайты на perl'e на том же хосте прекрасно работают с юникодом и проблем ниразу не было.

вот json http://files.host.ru/connectors/php/connector.php

{"cwd":{"hash":"cd5e1e6f103375b06956b1c9d654f3b0","name":"Home","mime":
"directory","rel":"Home","size":0,"date":"8 Jan 2011 05:22","read":true,"write":true,"rm":false},
"cdc":[{"name":"file.mmap","hash":"f0a344061d188c99575109726fcad373",
"mime":"application\/x-zip","date":"Yesterday
15:59","size":51104,"read":true,"write":true,"rm":true,
"url":"http:\/\/files.host.ru\/files\/file.mmap"},
{"name":"file.png","hash":"a248be5aa5cd176cf231c63abd010549","mime":"image\/png","date":"Yesterday
16:15","size":1124622,"read":true,"write":true,"rm":true,
"url":"http:\/\/files.host.ru\/files\/file.png","dim":"1284x5264","resize":true,
"tmb":"http:\/\/files.host.ru\/files\/.tmb\/a248be5aa5cd176cf231c63abd010549.png"},
{"name":"zzz\u044f\u044f\u044f.txt","hash":"970b21da5289afe3ad5cd2e618c9d2b2","mime":"application\/x-empty",
"date":"Today 05:22","size":0,"read":true,"write":true,"rm":true,
"url":"http:\/\/files.host.ru\/files\/zzz%D1%8F%D1%8F%D1%8F.txt"},
{"name":"zzz.txt","hash":"4f4ca78f2d431b91043ace788effb119",
"mime":"application\/x-empty","date":"Today 05:22","size":0,"read":true,"write":true,"rm":true,
"url":"http:\/\/files.host.ru\/files\/zzz.txt"}]}

насколько я понимаю вот это - zzz%D1%8F%D1%8F%D1%8F.txt - так и должно выглядеть, а вот это - zzz\u044f\u044f\u044f.txt - не то что нужно.
как можно узнать насколько php юникоден, если так можно выразиться?
обычный скрипт в юникоде с echo "яяяzzz" отдается как надо и в браузере все правильно отображается. как еще это можно проверить - я не знаю, т.к. в php я разбираюсь меньше всего.

на сервере в данный момент лежит 4 файла.
file.mmap
file.png
zzzяяя.txt
яяяzzz.txt

спасибо.

screenshot1.png (6.4 kB)

RE: Кодировка - Added by Troex Nevelin over 1 year ago

кодировку на сервере можно легко проверить командой locale:

$ locale
LANG=en_US.utf8
LC_CTYPE="en_US.utf8" 
LC_NUMERIC="en_US.utf8" 
LC_TIME="en_US.utf8" 
LC_COLLATE="en_US.utf8" 
LC_MONETARY="en_US.utf8" 
LC_MESSAGES="en_US.utf8" 
LC_PAPER="en_US.utf8" 
LC_NAME="en_US.utf8" 
LC_ADDRESS="en_US.utf8" 
LC_TELEPHONE="en_US.utf8" 
LC_MEASUREMENT="en_US.utf8" 
LC_IDENTIFICATION="en_US.utf8" 
LC_ALL=

zzz\u044f\u044f\u044f.txt - нормально ибо это utf-8 escape, а zzz%D1%8F%D1%8F%D1%8F.txt - это url encode, то и то верно.

Для теста попробуйте назвать файл не яяяzzz.txt, а например бббzzz.txt (с буквой "я" есть проблема в cp1251 кодировке). Ещё интересный момент, скачивается ли ваш файл (яяяzzz.txt) по url?

Проверить косячит ли это PHP можно легко вычислить простым скриптом:

$ls = scandir('/path/to/my/files');
print_r($ls);

RE: Кодировка - Added by Георгий Филатов over 1 year ago

кодировка именно такая.
с файлом бббzzz.txt такие же проблемы.
файл не скачивается - The requested URL /files/zzz.txt was not found on this server. в смысле если название, например, бббzzz.txt или яяяzzz.txt
php похоже не косячный, т.к. скрипт

$ls = scandir('/path/to/my/files');
print_r($ls);

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

RE: Кодировка - Added by Troex Nevelin over 1 year ago

Значит попахивает проблемой в php5-json...
Видимо, в вашем случае json_encode стоит заменить на самописный, так как встроенный может даёт где сбой, рекомендую почитать пост http://www.php.net/manual/en/function.json-encode.php#100835

Так же можете глянуть тикет #60 - тут есть patch под php4 с json_encode на чистом php, в инете таких реализаций должно быть море.

Предыдущая demo работала на PHP 5.2.0 под debian, текущая на 5.3.4, на 5.1.x получается если и тестировали только на ранней стадии разработки.

RE: Кодировка - Added by Георгий Филатов over 1 year ago

заменил везде в elFinder.class.php вызовы json_encode на функцию из патча. при этом в /etc/php.d/json.ini все закоментировал и перезапустил апач.
сам патч не применял.
если раньше имя файла заменялось на files.txt, то терепь имя полностью обрезается и остается только расширение - .txt
в общем не помогло.

насколько я понимаю, решить мою проблему может только переезд на более свежую версию php?

(1-6/6)