Заметил в логах сервера ошибку
PHP message: PHP Notice: iconv(): Wrong charset, conversion from `UTF-8‘ to `cp1251’ is not allowed in /public/iconv/file.php on line 22
PHP message: PHP Notice: iconv(): Wrong charset, conversion from `UTF-8‘ to `cp1251’ is not allowed in /public/iconv/file.php on line 22
PHP message: PHP Notice: iconv(): Wrong charset, conversion from `UTF-8‘ to `cp1251’ is not allowed in /public/iconv/file.php on line 22
…
PHP message: PHP Notice: iconv(): Wrong charset, conversion from `UTF-8‘ to `cp1251’ is not allowed in /public/iconv/file.php on line 22
PHP message: PHP Notice: iconv(): Wrong charset, conversion from `UTF-8‘ to `cp1251’ is not allowed in /public/iconv/file.php on line 22
…
Связка: PHP-FPM, Nginx, chroot
Как выяснилось, не хватает каких то файлов для правильной работы iconv, гугление не помогло, на помощь пришла стандартная утилита truss (аналог strace в Linux):
# truss iconv -f utf-8 -t cp1251 file.txt
…
open(«/usr/lib/i18n/libmapper_std.so.4»,O_CLOEXEC,041) = 4 (0x4)
…
open(«/usr/share/i18n/csmapper/CP/UCS%CP1251.mps»,O_CLOEXEC,037777703140) = 4 (0x4)
…
…
open(«/usr/lib/i18n/libmapper_std.so.4»,O_CLOEXEC,041) = 4 (0x4)
…
open(«/usr/share/i18n/csmapper/CP/UCS%CP1251.mps»,O_CLOEXEC,037777703140) = 4 (0x4)
…
В выхлопе комманды я увидел, что iconv берет файлы *.mps — это карты кодировок:
open(«/usr/lib/i18n/libmapper_std.so.4»,O_CLOEXEC,041) = 4 (0x4)
open(«/usr/share/i18n/csmapper/CP/UCS%CP1251.mps»,O_CLOEXEC,037777703140) = 4 (0x4)
open(«/usr/share/i18n/csmapper/CP/UCS%CP1251.mps»,O_CLOEXEC,037777703140) = 4 (0x4)
После этого я скопировал директории /usr/lib/i18n/ и /usr/share/i18n/ в chroot окружение и iconv перестал выдавать ошибки, решение не изящное, зато работает 🙂
Добавить комментарий