UTF-8 iso-kodierungsfrage

Allgemeiner Support zum phpBB 2 Board und phpBB 2 Modifikationen
Forumsregeln
Auch wenn hier der Support für phpBB 2 weiterhin aufrecht erhalten bleibt, weisen wir darauf hin, dass das phpBB 2 nicht mehr offiziell unterstützt und weiterentwickelt wird!
Antworten
schmidtedv
Beiträge: 607
Registriert: So 13.Feb, 2005 10:46
Wohnort: St. Blasien (seit 01.06)
Kontaktdaten:

UTF-8 iso-kodierungsfrage

Beitrag von schmidtedv »

Ich habe mal mein phpBB Projekt auf meinem Testserver komplett in UTF-8 umgewandelt...also Header, Sprachdateien, Mailtemplates, DB, etc. Etwas mühselig aber nun funktioniert es :-)

Ein, zwei Fragen hätte ich aber hierzu, wenn ich darf...

Es gibt 2 Dateien (Codestellen), die, so nehme ich an, direkt die Eingaben des Benutzers nehmen, also nicht UTF-8-abhängig reagieren.

In der functions_validate.php git es diese Stelle:

Code: Alles auswählen

function validate_email($email)
{
	global $db, $lang;

	if ($email != '') {
		if (preg_match('/^[a-z0-9&\'\.\-_\+]+@[a-z0-9\-äöü]+\.([a-z0-9\-äöü]+\.)*?[a-z]+$/is', $email)) {
			$sql = "SELECT ban_email
				FROM " . BANLIST_TABLE;
			if ($result = $db->sql_query($sql)) {
				if ($row = $db->sql_fetchrow($result)) {
					do {
						$match_email = str_replace('*', '.*?', $row['ban_email']);
						if (preg_match('/^' . $match_email . '$/is', $email)) {
							$db->sql_freeresult($result);
							return array('error' => true, 'error_msg' => $lang['Email_banned']);
						}
					} while ($row = $db->sql_fetchrow($result));
				}
			}
			$db->sql_freeresult($result);

			$sql = "SELECT user_email
				FROM " . USERS_TABLE . "
				WHERE user_email = '" . str_replace("\'", "''", $email) . "'";
			if (!($result = $db->sql_query($sql))) {
				message_die(GENERAL_ERROR, "Couldn't obtain user email information.", "", __LINE__, __FILE__, $sql);
			}

			if ($row = $db->sql_fetchrow($result)) {
				return array('error' => true, 'error_msg' => $lang['Email_taken']);
			}
			$db->sql_freeresult($result);

			return array('error' => false, 'error_msg' => '');
		}
	}

	return array('error' => true, 'error_msg' => $lang['Email_invalid']);
}
Ich habe äöü mal in utf8 umgewandelt und getestet und es scheint nicht zu gehen, also wieder zurück in äöü und es scheint richtig zu sein dies so zu belassen....?

Zum Zweiten in der usercp_register.php hab' ich unseren (mit dir zusammen erarbeiteten :-) ) code drin:

Code: Alles auswählen

	if ($board_config['force_realname']) {
		if (!empty($HTTP_POST_VARS['username'])) {
			if (!preg_match('/[A-Z]/', $username{0})) {
				$error = true;
				$error_msg = $lang['Wrong_username_ABC'];
			}

			if (!preg_match('/^[a-zäöüßÄÖÜ -]+$/i', $username)) {
				$error = true;
				$error_msg = $lang['Wrong_username_123'];
			}
		}

		if (!empty($HTTP_POST_VARS['username_reg'])) {
			if (!preg_match('/[A-Z]/', $username_reg{0})) {
				$error = true;
				$error_msg = $lang['Wrong_username_reg_ABC'];
			}

			if (!preg_match('/^[a-zäöüßÄÖÜ -]+$/i', $username_reg)) {
				$error = true;
				$error_msg = $lang['Wrong_username_reg_123'];
			}
		}
	$username = $username . ' ' . $username_reg;
	}
...der auch nicht umgewandelt werden darf, sonst gehts nicht...liegt das am preg_match ($HTTP_POST_VARS['username']), bzw. greift das direkt auf die eingegebenen zeichen zu und daher muss es so bleiben?

In der posting_attachments.php hingegen mußte folgende Stelle in UTF-8 umgewandelt werden:

Code: Alles auswählen

				if (!$cryptic) {
					$this->attach_filename = html_entity_decode(trim(stripslashes($this->attach_filename)));
					$this->attach_filename = delete_extension($this->attach_filename);
					$this->attach_filename = str_replace(array(' ', '-'), array('_', '_'), $this->attach_filename);
					$this->attach_filename = str_replace('__', '_', $this->attach_filename);
					$this->attach_filename = str_replace(array(',', '.', '!', '?', 'ü', 'Ü', 'ö', 'Ö', 'ä', 'Ä', ';', ':', '@', "'", '"', '&'), array('', '', '', '', 'ue', 'ue', 'oe', 'oe', 'ae', 'ae', '', '', '', '', '', 'and'), $this->attach_filename);
					$this->attach_filename = str_replace(array('$', 'ß', '>', '<', '§', '%', '=', '/', '(', ')', '#', '*', '+', "\\", '{', '}', '[', ']'), array('dollar', 'ss', 'greater', 'lower', 'paragraph', 'percent', 'equal', '', '', '', '', '', '', '', '', '', '', ''), $this->attach_filename);
					$this->attach_filename = preg_replace("/([\xC2\xC3])([\x80-\xBF])/e", "chr(ord('\\1')<<6&0xC0|ord('\\2')&0x3F)", $this->attach_filename);
					$this->attach_filename = rawurlencode($this->attach_filename);
					$this->attach_filename = preg_replace("/(%[0-9A-F]{1,2})/i", '', $this->attach_filename);
					$this->attach_filename = trim($this->attach_filename);

					$new_filename = $this->attach_filename;

					if (!$new_filename) {
						$u_id = (intval($userdata['user_id']) == ANONYMOUS) ? 0 : intval($userdata['user_id']);
						$new_filename = $u_id . '_' . $this->filetime . '.' . $this->extension;
					}

					do {
						$this->attach_filename = $new_filename . '_' . substr(rand(), 0, 3) . '.' . $this->extension;
					} while (physical_filename_already_stored($this->attach_filename));
Dabei fiel mir auf, das, sofern ich eine Datei mit Umlaut als erstem Buchstaben hochladen möchte, er sowohl dem Namen als auch der gespeicherten Datei den Umlaut vorne "klaut"....egal ob ascii oder utf8....gibt's da einen Fix für? Sollte ja nicht so sein, wenn man z.B. mal Ärgernis_Schwiegermutter.txt hochladen möchte :-)


Zu guter Letzt noch die Frage, ob ich search_stopwords.txt und search_synonyms.txt dann auch noch in utf8 umwandeln müßte...?

Vorab schon mal danke für jedweden Hinweis :-)
Rettet den Wald, esst mehr Specht!

Forum [ sofern im Beitrag darauf verwiesen :-) ]
Benutzeravatar
oxpus
Administrator
Beiträge: 28737
Registriert: Mo 27.Jan, 2003 22:13
Wohnort: Bad Wildungen
Kontaktdaten:

Beitrag von oxpus »

Ja. Die unterschiedlichen Zeichnsätze.
Damit triffst Du genau auf den richtigen Ahnungslosen :(

Soweit ich weiß, sind in allgemeinen Zeichensätzen (UTF-8 ist ein solcher) länderspezifische Sonderzeichen (wie eben z. B. die deutschen Umlaute) nicht enthalten und müssen mittels von Dir bereits beschriebener HTML-Tags ersetzt werden.
Bis hierhin ja alles noch klar.

ABER:
Was per UTF-8 codierter Seite mit Dateinamen passiert, kann ich so nicht wirklich sagen.
Wenn eine hochgeladene Datei mit einem Umlaut (beginnend oder enthalten) "verstümmelt" wird, müsste man das "Rohergebnis" mal testen, also den Dateinamen, der in $_FILES enthalten ist, anzeigen lassen.
Vielleicht wird hier schon codiert und anschliessend nur nicht korrekt darauf reagiert...

Wie gesagt:
Ich hatte mich bislang noch nicht so ausführlich mit den Zeichensätzen und deren "Probleme" beschäftigt, andere wissen hier sicherlich mehr...
Karsten Ude
-={ Das Mädchen für alles }=-
Kein Support per Messenger, Email oder PN! Unaufgeforderte Nachrichten werden ignoriert!
No support per Messenger, Email or PM. Each unasked message will be ignored!
schmidtedv
Beiträge: 607
Registriert: So 13.Feb, 2005 10:46
Wohnort: St. Blasien (seit 01.06)
Kontaktdaten:

Beitrag von schmidtedv »

Hab' mich jetzt nochmal eingehend mit der Materie beschäftigt...

Mein phpBB2-Projekt lasse ich auf ISO und gebe dem MySQL-Server, Apache und PHP als Standard latin1 / latin1_german2_ci / iso vor...so wird's gut für die meisten Eventualitäten und sollte richtig sein (bei einem zu 99% deutschen Server und dessen Inhalten)

phpBB3 arbeitet schon mit UTF-8, aber auch nur mittels Script, da es wohl innerhalb PHP keine Garantie für einwandfreies UTF-8 gibt....also zurückformatiert und, naja, beim "Standard" bleiben.

Mehr Info's auf Anfrage, LOL
Zuletzt geändert von schmidtedv am Di 15.Mai, 2007 10:38, insgesamt 1-mal geändert.
Rettet den Wald, esst mehr Specht!

Forum [ sofern im Beitrag darauf verwiesen :-) ]
Mahony
Beiträge: 1
Registriert: Fr 13.Apr, 2007 17:17

Beitrag von Mahony »

Hallo
Hier gibt es noch eine gute Beschreibung zum Thema Grundlegende Informationen zur Zeichenkodierung

Weiterhin wird hier die gesamte Problematik ausführlich beschrieben - Die Umlautproblematik - was, wieso, was tun?.




Grüße: Mahony
Antworten