00m.Ru
2Фев/140

FreeBSD PHP-FPM chroot — iconv(): Wrong charset, conversion from UTF-8 to cp1251 is not allowed

Заметил в логах сервера ошибку

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)
...

В выхлопе комманды я увидел, что 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)

После этого я скопировал директории /usr/lib/i18n/ и /usr/share/i18n/ в chroot окружение и iconv перестал выдавать ошибки, решение не изящное, зато работает 🙂