- Code: Select all
use utf8;
binmode(STDOUT,':utf8')
Auf dem gleichen Host habe ich auch eine MySQL-Datenbank laufen, die ich unter Schmerzen auf richtiges UTF-8 (utf8mb4) getrimmt habe:
- Code: Select all
mysql> SHOW variables LIKE 'character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
Die index.pl verbindet sich bei Requests auf diese Datenbank mit der Option mysql_enable_utf8, um die Daten direkt als UTF-8-abzuholen.
Rufen wir also mal das Script (auf meiner UTF-8-Konsole) auf:
- Code: Select all
Content-Type: text/html; charset=UTF-8
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
Weiß
</body>
</html>
Also, HTTP und HTML-Header werden auf jeden Fall UTF-8 gesetzt.
Was ist jetzt das Problem? Nun, Wenn ich die Option "mysql_enable_utf8" beim Connect mit der Datenbank gesetzt habe, dann bekomme ich auf der Website (im Browser, nicht auf der Konsole) Mojibake:
- Code: Select all
Wei�
Aber: wenn ich einem HTML-Element eine ID zuweise, die nicht-ISO-8859-1-kompatible Zeichen beinhaltet (z.B. id="文字化け" - Mojibake), DANN verschwindet die Mojibake:
- Code: Select all
<span id="文字化け">Weiß</span>
Da ich das Problem auf der Konsole nicht reproduzieren kann, gehe ich davon aus, dass das Problem nicht in meinem Script liegt, sondern dass der Apache einen Hirnriss hat und meine Daten lieber vorher nochmal in ISO-8859-1 konvertiert. Nur, wenn das nicht möglich ist (weil Japanische Schriftzeichen z.B. nicht in ISO-8859-1 vorkommen), lässt Apache diesen Hirnriss und reicht meine Daten einfach als UTF-8 durch.
Dazu sollte noch gesagt werden, dass das Zeichen "�" so ungefähr das ist, was ich als Zeichen erwarten würde, wenn ich das UTF-8-Zeichen "ß" an eine ISO-8859-1-Ausgabe senden würde.
Jetzt kann ich zwar überall in meine Ausgaben Japanische Zeichen einfügen, aber das kann's doch nicht sein, oder?