kostenloser Webspace werbefrei: lima-city


Alternative zu mb_detect_encoding() ?

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    gospielen

    gospielen hat kostenlosen Webspace.

    Hallo

    ich habe eine kleine Funktion, die mir einen String zu UTF-8 umwandelt,
    aber nur dann, wenn dieser String noch nicht bereits als UTF-8 vorliegt
    (... das soll doppeltes codieren verhindern ...)

    function convertToUTF8($str) {
        $enc = mb_detect_encoding($str, 'auto');
    
        if ($enc && $enc != 'UTF-8') {
            return iconv($enc, 'UTF-8', $str);
        } else {
            return $str;
        }
    }


    jetzt habe ich aber einen Webspace, bei dem die Funktion mb_detect_encoding() nicht verfügbar ist

    Fatal error: Call to undefined function mb_detect_encoding() in ...


    welche Alternative(n) gibt es, um zu prüfen, ob der String als UTF-8 vorliegt oder nicht ?

    ... bzw ... wie kann ich sonst sicher stellen, dass ein String nicht "doppelt" codiert wird ?


  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Mögliche Lösungsvorschläge gibt es doch in der PHP Doku http://php.net/manual/de/function.mb-detect-encoding.php, man muss nur etwas scrollen.
  4. Alternative zu mb_detect_encoding ... ja wenn iconv verfügbar ist :)

    a) Alternative für mb_detect_encoding()

    // -------------------------------------------
    
    if(!function_exists('mb_detect_encoding')) { 
    function mb_detect_encoding($string, $enc=null) { 
    	
    	static $list = array('utf-8', 'iso-8859-1', 'windows-1251');
    	
    	foreach ($list as $item) {
    		$sample = iconv($item, $item, $string);
    		if (md5($sample) == md5($string)) { 
    			if ($enc == $item) { return true; }	else { return $item; } 
    		}
    	}
    	return null;
    }
    }
    
    // -------------------------------------------



    B) Alternative für mb_convert_encoding()

    // -------------------------------------------
    
    if(!function_exists('mb_convert_encoding')) { 
    function mb_convert_encoding($string, $target_encoding, $source_encoding) { 
    	$string = iconv($source_encoding, $target_encoding, $string); 
    	return $string; 
    }
    }
    
    
    // -------------------------------------------


    zu a)
    Die Liste der Charsets
    $list = array('utf-8', 'iso-8859-1', 'windows-1251');

    kann man ja nach Bedarf anpassen ... siehe: character encodings

    PS: gibt sicher auch noch andere Alternativen :)
    aber diese mit iconv funktionieren bei mir ganz gut.


    EDIT:
    die Funktion a) ist nicht 1:1 "richtig" nach-gebaut ...

    denn mb_detect_encoding
    erwartet ja 3 Argumente (Parameters) ...
    mb_detect_encoding($string, $encoding_list und $strict)


    anstatt $encoding_list habe ich es aber nur mit ein einziger Charset $enc

    encoding_list is list of character encoding. Encoding order may be specified by array or comma separated list string.


    also.. hier der Code mit Verbesserung
    ... mit nur ein einzelner Charset als 2tes Argument (ohne Array oder Komma-Liste)
    // -------------------------------------------
    
    if(!function_exists('mb_detect_encoding')) { 
    function mb_detect_encoding($string, $enc=null, $strict=false) { 
    	$out = null; 
    	
    	if (!empty($enc) && $enc != 'null') { 
    		$sample = iconv($enc, $enc, $string);
    		if (md5($sample) == md5($string)) { 
    			if ($strict === true) { $out = true; } else { $out = $enc; } 
    		}
    	}
    	else { 
    	
    	static $list = array('utf-8', 'iso-8859-1', 'windows-1251');
    	
    	## http://www.php.net/manual/en/mbstring.supported-encodings.php
    	
    	foreach ($list as $item) {
    		$sample = iconv($item, $item, $string);
    		if (md5($sample) == md5($string)) { 
    			if ($strict === true) { $out = true; } else { $out = $item; } 
    			break; 
    		}
    	}
    	
    	}
    	
    	return $out;
    }
    }
    
    // -------------------------------------------


    ist aber immernoch nicht genau 1:1 ... weil im Original, weil als encoding
    auch eine Liste mehrerer Charsets $encoding_list als Argument genutzt werden kann


    dazu müsste man noch einbauen, ob $enc ein array oder eine Komma getrennte Liste als String ist,
    und jenachdem ob davon ein Treffer kommt die Ausgabe (return / $out) anpassen

    diese ausführlichere Variante habe ich allerdings nicht getestet,
    und ist ja auch noch nicht 1:1 wie das Original (to-do: encoding_list)
    .... aber (bei mir) geht's so wie oben (ohne "Verbesserung") ja auch erstmal

    :)


    Beitrag zuletzt geändert: 24.3.2013 15:49:02 von webparade
  5. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!