Setting Charset on Nginx PHP virtual host
Vincent M.
mouseless at free.fr
Sun Aug 4 13:11:36 UTC 2019
Unfortunately, I couldn't make it work by this way! I have my server
running on port 443 and specified on nginx.conf:
So I tried :
http {
charset_map iso-8859-1 utf-8 { }
server {
listen 9876;
charset utf-8;
}
}
On mywebsite conf file:
server {
charset_map iso-8859-1 utf-8 { };
override_charset on;
location /var/www/mywebsite.com/ {
proxy_pass http://127.0.0.1:9876/;
}
}
But the special characters was displayed with "?" not with � .
Anyway, it's a PHP issue not Nginx. The default PHP charset config is
set to "utf-8" and to overwrite it, I have added on the beginning of my
script:
ini_set('default_charset', 'iso-8859-1');
And it's working fine...
Thanks all for your help,
Vincent.
Le 02/08/2019 à 17:05, Francis Daly a écrit :
> On Fri, Aug 02, 2019 at 03:11:05PM +0200, Vincent M. wrote:
>
> Hi there,
>
>> So I tried in http with empty charset_map:
>> charset_map iso-8859-1 utf-8 { }
>> But special characters like é are displayed with ?
> It seems to work for me as-is. What is different for you?
>
> "work for me" means "the utf-8 character é becomes the 6 characters
> é, which the html-viewer is expected to display as LATIN SMALL
> LETTER E WITH ACUTE".
>
> nginx.conf:
> ===
> http {
> charset_map iso-8859-1 utf-8 { }
> server {
> listen 9876;
> charset utf-8;
> }
> server {
> listen 9877;
> charset iso-8859-1;
> override_charset on;
> location /x/ {
> proxy_pass http://127.0.0.1:9876/;
> }
> }
> }
> ===
>
> $ cat html/a/index.html
> little e: é; big E: É
> $ od -bc html/a/index.html
> 0000000 154 151 164 164 154 145 040 145 072 040 303 251 073 040 142 151
> l i t t l e e : 303 251 ; b i
> 0000020 147 040 105 072 040 303 211 040 012
> g E : 303 211 \n
> 0000031
>
> $ curl -i http://127.0.0.10:9876/a/ # headers edited
> HTTP/1.1 200 OK
> Server: nginx/1.17.2
> Content-Type: text/html; charset=utf-8
>
> little e: é; big E: É
>
> $ curl -i http://127.0.0.10:9877/x/a/ # headers edited
> HTTP/1.1 200 OK
> Server: nginx/1.17.2
> Content-Type: text/html; charset=iso-8859-1
>
> little e: é; big E: É
>
>
> And when I change nginx.conf to include a partial "correct" charset map:
>
> ===
> charset_map iso-8859-1 utf-8 {
> E9 C3A9;
> }
> ===
>
> $ curl -i http://127.0.0.10:9877/x/a/
> HTTP/1.1 200 OK
> Server: nginx/1.17.2
> Content-Type: text/html; charset=iso-8859-1
>
> little e: �; big E: É
>
> $ curl -i http://127.0.0.10:9877/x/a/ | tail -n 1 | od -bc
> 0000000 154 151 164 164 154 145 040 145 072 040 351 073 040 142 151 147
> l i t t l e e : 351 ; b i g
> 0000020 040 105 072 040 046 043 062 060 061 073 040 012
> E : & # 2 0 1 ; \n
> 0000034
>
> The utf-8 e-acute was changed to the correct iso-8859-1 octet (octal
> 351/hex e9/decimal 233), which my terminal renders as "unknown" because
> it is invalid utf-8.
>
>> Where to find a charset_map?
> It should not be necessary, according to the nginx docs, due to the
> html-replacement; but if you want one, you can find-or-create one.
>
> Basically, every octet from A0 to FF maps to the utf-8 equivalent from
> C2A0 to C2BF and from C380 to C3BF.
>
> The format matches the three example charset-map files that nginx
> provides.
>
> Oh - as one other wrinkle -- it is possible that the visual character
> e-acute is *not* sent as the octets C3A9; but is instead sent as the
> octets 65CC81 (e, following by a combining acute accent) -- and off-hand,
> I don't know nginx will convert that. Possibly é, which might not
> render very nicely in your html viewer.
>
> But before you worry about that extra wrinkle, see what octets are sent,
> and see where the problem comes in that makes something show as the ?
>
> Cheers,
>
> f
More information about the nginx
mailing list