Newsgroup: it.comp.www.php
Titolo: UTF-8 capire se lo è

Utilizzo questa funzione:
function isUTF8($string)
{
    if (is_array($string))
    {
        $enc = implode('', $string);
        return @!((ord($enc[0]) != 239) && (ord($enc[1]) != 187) && 
(ord($enc[2]) != 191));
    }
    else
    {
        return (utf8_encode(utf8_decode($string)) == $string);
    }
}
Per verificare che il contenuto del mio DB sia in UTF-8 e, in caso 
contrario convertirlo.
Succede con alcune codifiche che questo non avvenga o per mancato 
riconoscimento della codifica stessa o nel tentativo di utf8_encode di 
far l'encode di un testo già utf-8.
Mi sapete dire dove trovare maggiori info o modifiche per la funzione?
-- 
Amministratore
www.AmiciAmici.com
Giornalismo dal basso sui temi dell'amicizia, feste e divertimento.
PodCast "Pronto Chi Bussa" dalla Valtaro al Web...

 
Guardando meglio su 
php.net
 ho trovato questa soluzione che, per ora, 
sembra essere quella corretta:
function isUTF8($string)
{
    $string_utf8 = utf8_encode($string);
    if( strpos($string_utf8,"ƒ",0) !== false ) // "ƒ" is ALT+159
          return true;  // the original string was utf8
    else
          return false; // otherwise


 
Bisognerebbe estendere il controllo anche su altri caratteri, ad esempio 
gli ', che possono comparire in stringhe di testo corte (ad esempio i 
titoli).


Mi sapete dire dove trovare maggiori info o modifiche per la funzione?
Un testo UTF8 contiene:
	- Caratteri da 0 a 127
	- Sequenze del tipo A N con A compreso fra 194 e 223, e N fra
	  128 e 191
	- Sequenze del tipo B N N con B compreso fra 224 e 239
	- Sequenze del tipo C N N N con C fra 240 e 244
          (245, 246, 247 e 248-253 sono 'restricted' ex RFC 3629)
Quindi:
	- Se ogni carattere della stringa e' fra 0 e 127, e' UTF8, ma
	  indistinguibile da ASCII7 ($str == utf8_encode($str))
	- Se contiene caratteri da 128 a 191, preceduti da ASCII7, e'
	  ASCII8 e deve essere passato a utf8_encode
	- Se contiene caratteri da 192 a 255, non seguiti da 128-191,
	  e' ASCII8
	- Se contiene caratteri da 192 a 255, seguiti da 128-191 come
	  sopra, e' UTF8... o hai una sfiga che se tte vede 'a morte,
	  se tocca li cojoni.
Il problema e' farlo in modo efficiente in PHP.
Questi sono due suggerimenti dal manuale:
<?php
// Returns true if $string is valid UTF-8 and false otherwise.
function is_utf8($string) {
 
   // From 
http://w3.org/International/questions/qa-forms-utf-8.html
   return preg_match('%^(?:
         [\x09\x0A\x0D\x20-\x7E]            # ASCII
       | [\xC2-\xDF][\x80-\xBF]            # non-overlong 2-byte
       |  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
       | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
       |  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
       |  \xF0[\x90-\xBF][\x80-\xBF]{2}    # planes 1-3
       | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
       |  \xF4[\x80-\x8F][\x80-\xBF]{2}    # plane 16
   )*$%xs', $string);
 
} // function is_utf8
<?php
function detectUTF8($string)
{
       return preg_match('%(?:
       [\xC2-\xDF][\x80-\xBF]        # non-overlong 2-byte
       |\xE0[\xA0-\xBF][\x80-\xBF]              # excluding overlongs
       |[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}      # straight 3-byte
       |\xED[\x80-\x9F][\x80-\xBF]              # excluding surrogates
       |\xF0[\x90-\xBF][\x80-\xBF]{2}    # planes 1-3
       |[\xF1-\xF3][\x80-\xBF]{3}                  # planes 4-15
       |\xF4[\x80-\x8F][\x80-\xBF]{2}    # plane 16
       )+%xs', $string);
}
?> 
Certo, se hai mb_detect_encoding e' tutto piu' facile :-D
Leonardo
-- 
Geordie - he's a man, there's little doot about't,
He's done all he can, wha' can do withoot't?
Doon there cam a blade, linkin' like me lordie,
He wad drive a trade, a' the loom of Geordie.