Seite 1 von 1

türkische zeichen umwandeln

Verfasst: 25.08.2006, 23:30
von DJTonic
ich sitze hier gerade an einem problem, an dem ich mir irgendwie die zähne ausbeisse.

nehmen wir an ich habe einen türkischen städtenamen:
Çığlık

diese sonderzeichen möchte ich in "deutsche" zeichen umwandeln.

aus Çığlık soll also Ciglik werden.

leider ist mein problem nicht nur auf türkisch beschränkt. hat da jemand einen ansatz?

Verfasst:
von

Verfasst: 26.08.2006, 00:13
von Southmedia

Code: Alles auswählen

$from = 'àáâãåçèéêëìíîïñòóôõøšùúû';
$to   = 'aaaaaceeeeiiiinooooosuuu';
$clean_string = strtr($string, $from, $to);
$from enthält die türkischen Zeichen (einfach alles reinmachen was du findest), $to die saubere Entsprechnung. Ob es eine Lösung über reguläre Ausdrücke gibt weiss ich nicht. strtr ist wunderbar schnell.

strtr() hilft auch wenn du Œ durch OE ersetzen musst, einfach nur 2 Parameter benutzen wobei das zweite ein Array ist das im Schlüssel das zu ersetzende, im Wert das ersetzende Zeichen enthält.

Verfasst: 26.08.2006, 00:16
von Southmedia
Ach ja, wäre nett wenn du die Ersetzungsliste hier dann ggf. posten könntest :)

Verfasst: 26.08.2006, 11:36
von DJTonic
danke für deinen code jan. leider haben wir wohl aneinander vorbeigeredet :-)
diesen code hätte ich schon eingesetzt, ich wollte es halt vermeiden, dutzende zeichensätze nach allen zeichen mit einem zusatzkringel zu durchsuchen :wink:
(weil: problem ist generell und nicht auf türkisch beschränkt)

wird mir wohl dann nix anderes übrig bleiben, sofern nicht schonmal wer das gemacht hat :cry:

Verfasst: 26.08.2006, 13:09
von Southmedia
Zeichentabellen sollten sich im Netz finden lassen. Deine Aufgabe besteht dann nur darin, die sauberen Ersetzungen zusammenzusammeln.

Verfasst: 26.08.2006, 17:25
von Southmedia
Also ich habe noch ein wenig gesucht. Eine Idee ist den String erst durch htmlentities laufen zu lassen und dann zu ersetzen, finde ich gar nicht so doof:

https://de3.php.net/manual/de/function. ... .php#68480
https://de3.php.net/manual/de/function. ... .php#51262

Verfasst: 26.08.2006, 17:28
von Southmedia
Wordpress geht den heftigeren Weg um Titel von Postings in Strings zu verwandeln die in URLs nutzbar sind, hier die wichtigsten (soweit ich das überblicke, der Wordpresscode ist nicht gerade ein Meisterwerk...) Funktionen:

Code: Alles auswählen

function remove_accents($string) {
	if (seems_utf8($string)) {
		$chars = array(
		// Decompositions for Latin-1 Supplement
		chr(195).chr(128) => 'A', chr(195).chr(129) => 'A',
		chr(195).chr(130) => 'A', chr(195).chr(131) => 'A',
		chr(195).chr(132) => 'A', chr(195).chr(133) => 'A',
		chr(195).chr(135) => 'C', chr(195).chr(136) => 'E',
		chr(195).chr(137) => 'E', chr(195).chr(138) => 'E',
		chr(195).chr(139) => 'E', chr(195).chr(140) => 'I',
		chr(195).chr(141) => 'I', chr(195).chr(142) => 'I',
		chr(195).chr(143) => 'I', chr(195).chr(145) => 'N',
		chr(195).chr(146) => 'O', chr(195).chr(147) => 'O',
		chr(195).chr(148) => 'O', chr(195).chr(149) => 'O',
		chr(195).chr(150) => 'O', chr(195).chr(153) => 'U',
		chr(195).chr(154) => 'U', chr(195).chr(155) => 'U',
		chr(195).chr(156) => 'U', chr(195).chr(157) => 'Y',
		chr(195).chr(159) => 's', chr(195).chr(160) => 'a',
		chr(195).chr(161) => 'a', chr(195).chr(162) => 'a',
		chr(195).chr(163) => 'a', chr(195).chr(164) => 'a',
		chr(195).chr(165) => 'a', chr(195).chr(167) => 'c',
		chr(195).chr(168) => 'e', chr(195).chr(169) => 'e',
		chr(195).chr(170) => 'e', chr(195).chr(171) => 'e',
		chr(195).chr(172) => 'i', chr(195).chr(173) => 'i',
		chr(195).chr(174) => 'i', chr(195).chr(175) => 'i',
		chr(195).chr(177) => 'n', chr(195).chr(178) => 'o',
		chr(195).chr(179) => 'o', chr(195).chr(180) => 'o',
		chr(195).chr(181) => 'o', chr(195).chr(182) => 'o',
		chr(195).chr(182) => 'o', chr(195).chr(185) => 'u',
		chr(195).chr(186) => 'u', chr(195).chr(187) => 'u',
		chr(195).chr(188) => 'u', chr(195).chr(189) => 'y',
		chr(195).chr(191) => 'y',
		// Decompositions for Latin Extended-A
		chr(196).chr(128) => 'A', chr(196).chr(129) => 'a',
		chr(196).chr(130) => 'A', chr(196).chr(131) => 'a',
		chr(196).chr(132) => 'A', chr(196).chr(133) => 'a',
		chr(196).chr(134) => 'C', chr(196).chr(135) => 'c',
		chr(196).chr(136) => 'C', chr(196).chr(137) => 'c',
		chr(196).chr(138) => 'C', chr(196).chr(139) => 'c',
		chr(196).chr(140) => 'C', chr(196).chr(141) => 'c',
		chr(196).chr(142) => 'D', chr(196).chr(143) => 'd',
		chr(196).chr(144) => 'D', chr(196).chr(145) => 'd',
		chr(196).chr(146) => 'E', chr(196).chr(147) => 'e',
		chr(196).chr(148) => 'E', chr(196).chr(149) => 'e',
		chr(196).chr(150) => 'E', chr(196).chr(151) => 'e',
		chr(196).chr(152) => 'E', chr(196).chr(153) => 'e',
		chr(196).chr(154) => 'E', chr(196).chr(155) => 'e',
		chr(196).chr(156) => 'G', chr(196).chr(157) => 'g',
		chr(196).chr(158) => 'G', chr(196).chr(159) => 'g',
		chr(196).chr(160) => 'G', chr(196).chr(161) => 'g',
		chr(196).chr(162) => 'G', chr(196).chr(163) => 'g',
		chr(196).chr(164) => 'H', chr(196).chr(165) => 'h',
		chr(196).chr(166) => 'H', chr(196).chr(167) => 'h',
		chr(196).chr(168) => 'I', chr(196).chr(169) => 'i',
		chr(196).chr(170) => 'I', chr(196).chr(171) => 'i',
		chr(196).chr(172) => 'I', chr(196).chr(173) => 'i',
		chr(196).chr(174) => 'I', chr(196).chr(175) => 'i',
		chr(196).chr(176) => 'I', chr(196).chr(177) => 'i',
		chr(196).chr(178) => 'IJ',chr(196).chr(179) => 'ij',
		chr(196).chr(180) => 'J', chr(196).chr(181) => 'j',
		chr(196).chr(182) => 'K', chr(196).chr(183) => 'k',
		chr(196).chr(184) => 'k', chr(196).chr(185) => 'L',
		chr(196).chr(186) => 'l', chr(196).chr(187) => 'L',
		chr(196).chr(188) => 'l', chr(196).chr(189) => 'L',
		chr(196).chr(190) => 'l', chr(196).chr(191) => 'L',
		chr(197).chr(128) => 'l', chr(197).chr(129) => 'L',
		chr(197).chr(130) => 'l', chr(197).chr(131) => 'N',
		chr(197).chr(132) => 'n', chr(197).chr(133) => 'N',
		chr(197).chr(134) => 'n', chr(197).chr(135) => 'N',
		chr(197).chr(136) => 'n', chr(197).chr(137) => 'N',
		chr(197).chr(138) => 'n', chr(197).chr(139) => 'N',
		chr(197).chr(140) => 'O', chr(197).chr(141) => 'o',
		chr(197).chr(142) => 'O', chr(197).chr(143) => 'o',
		chr(197).chr(144) => 'O', chr(197).chr(145) => 'o',
		chr(197).chr(146) => 'OE',chr(197).chr(147) => 'oe',
		chr(197).chr(148) => 'R',chr(197).chr(149) => 'r',
		chr(197).chr(150) => 'R',chr(197).chr(151) => 'r',
		chr(197).chr(152) => 'R',chr(197).chr(153) => 'r',
		chr(197).chr(154) => 'S',chr(197).chr(155) => 's',
		chr(197).chr(156) => 'S',chr(197).chr(157) => 's',
		chr(197).chr(158) => 'S',chr(197).chr(159) => 's',
		chr(197).chr(160) => 'S', chr(197).chr(161) => 's',
		chr(197).chr(162) => 'T', chr(197).chr(163) => 't',
		chr(197).chr(164) => 'T', chr(197).chr(165) => 't',
		chr(197).chr(166) => 'T', chr(197).chr(167) => 't',
		chr(197).chr(168) => 'U', chr(197).chr(169) => 'u',
		chr(197).chr(170) => 'U', chr(197).chr(171) => 'u',
		chr(197).chr(172) => 'U', chr(197).chr(173) => 'u',
		chr(197).chr(174) => 'U', chr(197).chr(175) => 'u',
		chr(197).chr(176) => 'U', chr(197).chr(177) => 'u',
		chr(197).chr(178) => 'U', chr(197).chr(179) => 'u',
		chr(197).chr(180) => 'W', chr(197).chr(181) => 'w',
		chr(197).chr(182) => 'Y', chr(197).chr(183) => 'y',
		chr(197).chr(184) => 'Y', chr(197).chr(185) => 'Z',
		chr(197).chr(186) => 'z', chr(197).chr(187) => 'Z',
		chr(197).chr(188) => 'z', chr(197).chr(189) => 'Z',
		chr(197).chr(190) => 'z', chr(197).chr(191) => 's',
		// Euro Sign
		chr(226).chr(130).chr(172) => 'E');

		$string = strtr($string, $chars);
	} else {
		// Assume ISO-8859-1 if not UTF-8
		$chars['in'] = chr(128).chr(131).chr(138).chr(142).chr(154).chr(158)
			.chr(159).chr(162).chr(165).chr(181).chr(192).chr(193).chr(194)
			.chr(195).chr(196).chr(197).chr(199).chr(200).chr(201).chr(202)
			.chr(203).chr(204).chr(205).chr(206).chr(207).chr(209).chr(210)
			.chr(211).chr(212).chr(213).chr(214).chr(216).chr(217).chr(218)
			.chr(219).chr(220).chr(221).chr(224).chr(225).chr(226).chr(227)
			.chr(228).chr(229).chr(231).chr(232).chr(233).chr(234).chr(235)
			.chr(236).chr(237).chr(238).chr(239).chr(241).chr(242).chr(243)
			.chr(244).chr(245).chr(246).chr(248).chr(249).chr(250).chr(251)
			.chr(252).chr(253).chr(255);

		$chars['out'] = "EfSZszYcYuAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy";

		$string = strtr($string, $chars['in'], $chars['out']);
		$double_chars['in'] = array(chr(140), chr(156), chr(198), chr(208), chr(222), chr(223), chr(230), chr(240), chr(254));
		$double_chars['out'] = array('OE', 'oe', 'AE', 'DH', 'TH', 'ss', 'ae', 'dh', 'th');
		$string = str_replace($double_chars['in'], $double_chars['out'], $string);
	}

	return $string;
}

function sanitize_title($title, $fallback_title = '') {
	$title = strip_tags($title);
	$title = apply_filters('sanitize_title', $title);

	if (empty($title)) {
		$title = $fallback_title;
	}

	return $title;
}

function sanitize_title_with_dashes($title) {
	$title = strip_tags($title);
	// Preserve escaped octets.
	$title = preg_replace('|%([a-fA-F0-9][a-fA-F0-9])|', '---$1---', $title);
	// Remove percent signs that are not part of an octet.
	$title = str_replace('%', '', $title);
	// Restore octets.
	$title = preg_replace('|---([a-fA-F0-9][a-fA-F0-9])---|', '%$1', $title);

	$title = remove_accents($title);
	if (seems_utf8($title)) {
		if (function_exists('mb_strtolower')) {
			$title = mb_strtolower($title, 'UTF-8');
		}
		$title = utf8_uri_encode($title);
	}

	$title = strtolower($title);
	$title = preg_replace('/&.+?;/', '', $title); // kill entities
	$title = preg_replace('/[^%a-z0-9 _-]/', '', $title);
	$title = preg_replace('/\s+/', '-', $title);
	$title = preg_replace('|-+|', '-', $title);
	$title = trim($title, '-');

	return $title;
}

Verfasst: 26.08.2006, 17:38
von DJTonic
so, ich werd mein problem jetzt nochmal spezifizieren und danach deine beiden methoden testen:
ich bekomme den ortnamen im QUELLTEXT so:
Çığlık

im BROWSER sieht es so aus:
Çığlık

logisch, da wirds ja utf-8 angezeigt

folglich funktioniert dein allererster ansatz mit strstr nicht.

der wordpressansatz sieht aber schonmal gut aus, den teste ich jetzt mal.

edit: der wordpress-workaround funktioniert perfekt.
jan, ich liebe dich :lol: :lol: :lol:

Verfasst: 26.08.2006, 17:41
von Southmedia
Hier findet sich ein regulärer Ausdruck um alle non-ASCII / non-ISO-8859-1 - Zeichen zu filtern:
https://www.sitepoint.com/forums/showth ... ost1864683

Fehlt "nur" die Ersetzung...

Verfasst: 26.08.2006, 17:50
von DJTonic
um dann zum krönenden abschluss aus dem wordpress-funktion noch die deutschem umlaute nicht umwandeln zu lassen, hier die chars die man beim
// Decompositions for Latin-1 Supplement
-Teil rauslöschen sollte:

ü 195 188
Ü 195 156
ä 195 164
Ä 195 132
ö 195 182
Ö 195 150
ß 195 159

diese kann man dann wiederrum mit utf8_encode umwandeln.

Verfasst: 26.08.2006, 17:58
von Southmedia
Na das ist doch schonmal was.

Jetzt nur hoffen, dass da alle Zeichen abgedeckt sind. Man könnte mal rausfinden, wer die Funktion geschrieben hat bzw wo die Wordpress-Macher sie geklaut haben. Vielleicht gibt es schon verbesserte und erweiterte Versionen.

Verfasst: 26.08.2006, 18:26
von DJTonic
ob das alles abdeckt werde ich in kurzer zeit wissen :lol: