Avatar billede hoppe11 Nybegynder
20. juni 2007 - 18:54 Der er 7 kommentarer og
1 løsning

wordwrap og uft8

hvordan kan man lave en wordwrap() på en string med et uft8 tegnsæt.. man kan jo være uheldig at den wrapper et 2 byte tegn midt over?
Avatar billede horsmark Nybegynder
20. juni 2007 - 19:17 #1
wordwrap(utf8_decode($s)); ?
Avatar billede hoppe11 Nybegynder
21. juni 2007 - 20:02 #2
jeg kan ikke bruge utf8_decode, da den jo kun konverterer til iso-8859-1
Avatar billede horsmark Nybegynder
22. juni 2007 - 06:04 #3
hmm hvilket tegnsæt dækker utf8 over så - flere forskellige eller hyr ?
Avatar billede hoppe11 Nybegynder
22. juni 2007 - 15:06 #4
utf8 er 1-2 byte tegn (65536)

iso-8859-1 er kun 1 byte tegn (256)

er der ikke en mulighed for at se om et givent "enkelt" byte tegn er en del af et "fler" byte tegn?
Avatar billede gentlebug Nybegynder
22. juni 2007 - 15:11 #5
php.net er din ven:  http://dk.php.net/wordwrap - tjomi4 at yeap dot lv (23-Sep-2005 12:26)

tf8_wordwrap();

usage: utf8_wordwrap("text",3,"<br>");
coded by tjomi4`, thanks to SiMM.
web: www.yeap.lv

<?php

function utf8_wordwrap($str,$len,$what){
# usage: utf8_wordwrap("text",3,"<br>");
# by tjomi4`, thanks to SiMM.
# www.yeap.lv
$from=0;
$str_length = preg_match_all('/[\x00-\x7F\xC0-\xFD]/', $str, $var_empty);
$while_what = $str_length / $len;
while($i <= round($while_what)){
$string = preg_replace('#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$from.'}'.
                      '((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$len.'}).*#s',
                      '$1',$str);
$total .= $string.$what;
$from = $from+$len;
$i++;
}
return $total;
}
?>

- ikke testet, af mig ihvertfald.
Avatar billede hoppe11 Nybegynder
22. juni 2007 - 20:42 #6
Jeg har modificeret koden lidt :) Men den gør ikke helt som jeg vil have den til. I stedet for at wrappe efter hvert eneste f.eks. 20. tegn, skal den starte forfra med at tælle ved de mellemrum strengen i indeholder i forvejen

function utf8_strlen($str)
{
    $str_len = preg_match_all('/[\x00-\x7F\xC0-\xFD]/', $str, $var_empty);
   
    return $str_len;
}

function utf8_wordwrap($str, $wrap, $replace = ' ')
{
    $str_len = utf8_strlen($str);
    $wrap_count = round($str_len / $wrap);
   
    $pointer = 0;
    $i = 0;
    while($i <= $wrap_count)
    {
        $new_str .= preg_replace('/^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$pointer.'}((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$wrap.'}).*/s', '$1', $str).$replace;
       
        $pointer += $wrap;
        $i++;
    }
   
    return $new_str;
}
Avatar billede hoppe11 Nybegynder
23. juni 2007 - 00:34 #7
gentlebug > smid et svar :)

hvis andre kunne få nytte af svaret:

function utf8_strlen($str)
{
    return preg_match_all('/[\x00-\x7F\xC0-\xFD]/', $str, $var_empty);
}

function utf8_wordwrap($str, $wrap)
{
    return preg_replace('/[^ \n]+/e', 'utf8_wordwrap_callback("$0", $wrap)', $str);
}

function utf8_wordwrap_callback($str, $wrap)
{
    $str_len = utf8_strlen($str);
    $wrap_count = ceil($str_len / $wrap);
   
    $pointer = 0;
    $arr = array();
    for($i = 0; $i <= $wrap_count; $i++)
    {
        $arr[] = preg_replace('/^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$pointer.'}((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$wrap.'}).*/', '$1', $str);
       
        $pointer += $wrap;
    }
   
    return implode(' ', $arr);
}
Avatar billede gentlebug Nybegynder
24. juni 2007 - 16:05 #8
Et svar er smidt ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester