Autor Zpráva
xlifer
Profil
Přecházel jsem na Windows 10 a přeinstaloval jsem si i Apache server, ale mám teď problém s kódováním serveru, který jak to vypadá posílá HTTP hlavičku s kódováním UTF-8 jako výchozí.

Potřebuji server nastavit tak, aby "neposílal" výchozí kódování v hlavičce, ale aby si každá stránka přebrala kódování, které je uvedeno v HTML meta značce stránky. Nevím co do konfiguračního souboru Apache httpd.conf nebo PHP php.ini napsat/změnit? Mám verzi Apache 2.4.18/PHP 5.6.16.
nightfish
Profil
AddDefaultCharset off
Podrobnosti najdeš v dokumentaci.
xlifer
Profil
Tak problém je od verze PHP 5.6.0, kde je výchozí hodnota kódování UTF-8.

A to i v případě, kdy je nastavení "default_charset" v php.ini zakomentováno:
;default_charset = "UTF-8"

nebo ponecháno jako prázdná hodnota:
default_charset =

V obou případech je v PHP Core "default_charset" UTF-8.

Na rozdíl od starších verzí PHP, kde je hodnota v případě neuvedení charset "no value".

Jediné řešení je do všech .php souborů projektu doplnit hlavičku:
header("Content-Type: text/html; charset=XXX");

U .html souborů se kódování vždy z META hlavičky.

Problém je v tom, že kdo používal kódování windows-1250, jako například já :-(, tak při přechodu na verzi PHP >= 5.6.0 musí řešit tento problém přes header hlavičku nebo provozovat více verzí PHP.

Zkoušel jsem, zda nejde přebít výchozí kódování UTF-8 přes .htaccess, ale to se mi nedaří.
Davex
Profil
V PHP 7 stačí v php.ini nastavit default_charset = "" a charset se přestane do hlavičky Content-Type přidávat.

Nicméně default_charset se v dalších konfiguračních volbách používá jako výchozí hodnota, pokud nejsou nastavené, takže jeho nevyplnění může mít další nežádoucí efekty. Případně některé funkce, které tuto hodnotu používají, mohou mít neočekávané výsledky (typicky třeba funkce htmlspecialchars()), ale nijak detailně jsem to netestoval.
host
Profil *
Davexuv prispevek funguje i pro verzi 5.6.0 a vyssi.
host
Profil *
Ale ma problem se zminenou funkci htmlspecialchars(). Nevite, jak toto poresit? Diky.
Kajman
Profil
host:
Nastavíte třetí parametr té funkce, protože defaultně bere ini_get("default_charset").
Davex
Profil
host:
Ale ma problem se zminenou funkci htmlspecialchars().
Předpokládám, že nebude problém jen s touto funkcí při použití kódování windows-1250 nebo iso-8859-2 na webu provozovaném s PHP 5.6 a 7.0+. Pokud je web v kódování UTF-8, tak bych tam výchozí konfiguraci neměnil.

Pro windows-1250 a iso-8859-2 by mělo stačit upravit konfiguraci PHP takto (je to přenesená výchozí konfigurace PHP 5.3, 5.4 a 5.5):

[PHP]
default_charset = ""
internal_encoding = ISO-8859-1
input_encoding = ISO-8859-1
output_encoding = ISO-8859-1
xlifer
Profil
Na localhostu, kde je provozováno více projektů s různým kódováním se mi v praxi nejvíce osvědčilo řešení od Davexa, nastavit nedoporučované default_charset = "". Je nutné pak myslet na funkce jako htmlspecialchars apod. jak se píše výše.

Protože toto nastavení není správné, když je hodnota charset prázdná, tak mě napadlo, zda není nějaká možnost nastavit jiný charset aspoň pro každý virtualhost samostatně? Tzn. že bych nechal výchozí nastavení UTF-8, ale u projektů, kde je např. kódování windows-1250, bych nastavil pro ten konkrétní virtualhost jiný charset nebo vypnul výchozí UTF-8. Nepřišel jsem na způsob jak to nastavit, buď to vůbec nelze nebo nevím jak.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0