Периодически возникающая проблема с Юникодом на веб-страницах (perl, apache, fast cgi)

#apache #perl #utf-8 #fastcgi

#apache #perl #utf-8 #fastcgi

Вопрос:

Мы используем perl и fastcgi на серверах. Страницы загружены для нескольких языков. На некоторых, но не на всех страницах мы видим черные бриллианты судьбы, но на той же странице на другом языке мы не видим такой проблемы. Похоже, что это не связано с базой данных, поскольку мы видели проблему, даже если ответ БД содержит только ascii. Похоже, это также не происходит для каждого пользователя на страницах.

https://fbref.com/en/players/b56b56d7/Kevin-Le-Sauce против https://fbref.com/it/calciatori/b56b56d7/Kevin-Le-Sauce

На скриншотах ниже используемые данные БД точно такие же.

Страница на английском
Страница на итальянском

Наша текущая лучшая теория заключается в том, что это связано с FASTCGI и Apache, но мы не понимаем, почему это происходит так, как есть, а не для всех запросов.

Комментарии:

1. Это довольно просто: HTTP и HTML говорят, что документ находится в UTF-8 , пока он есть на самом деле ISO-8859-1 (посмотрите на него в шестнадцатеричном редакторе). И, учитывая, что все отображается неправильно , я предполагаю, что один из ваших файлов шаблонов / языков неправильно закодирован.

2. К сожалению, это не так просто. Если мы запускаем «file» для каждого скрипта и шаблона, они отображаются как utf8 или ASCII, на двух страницах используются те же шаблоны, что и при использовании Locale::TextDomain для i18n

3. Вы не поделились никаким кодом, поэтому не так много. Убедитесь, что ни один из ваших скриптов не перекодирует какие-либо строки. Проверьте, чтобы дескрипторы вывода были установлены в utf8. Проверьте, что ваше подключение к базе данных (если таковое имеется) использует UTF-8.

4. Вы действительно просматривали файлы и тела HTTP-сообщений для проверки кодировок?

5. Да, у нас есть. Если мы запустим curl для двух файлов, в одном будет указан iso-8859 … а в другом utf8. Если мы запускаем сценарии perl из командной строки, они оба отображаются как utf8.