הוסטס - פורום אחסון האתרים הגדול בישראל

הוסטס - פורום אחסון האתרים הגדול בישראל (https://hosts.co.il/forums/index.php)
-   פורום תיכנות (https://hosts.co.il/forums/forumdisplay.php?f=14)
-   -   לכל המתכנתים שעובדים עם UTF8 (https://hosts.co.il/forums/showthread.php?t=42562)

RS324 01-04-07 03:54

לכל המתכנתים שעובדים עם UTF8
 
אני רוצה להדגיש כמה בעיות שאני בטוח שכמעט כולכם לא יודעים על UTF8 ומחרוזות

כל הדוגמאות יצאו מתוך הנחה שהמחרוזת ב UTF8

דוגמא א' :

PHP קוד:

$string =  'אאאאב';
echo 
strlen($string); 

הפלט של STRLEN (למי שלא יודע זה פונקציה שמחשבת אורך מחרוזת) יהיה 10
כן 10 ולא 5. הסיבה : STRLEN קורא את UTF8 כ 2 ביטים לכל אות.

הפתרון :בהמשך.

דוגמא ב' :
PHP קוד:

$string =  'אאאאב';
echo 
substr($string,0,3); 

פלט רצוי : אאא
פלט שמתקבל : א�אאאאב.
הסיבה : SUBSTR לא יודע לחתוך את האותיות כמו שצריך ולכן יש אותיות שנחתכות באמצע ועושות בלגן

עקרונית אפשר להמשיך ככה עד מחר...
את הפתרון אני אשאיר לכם למצוא בעזרת גוגל.
יום נעים שיהיה לכם.

mlnn 01-04-07 04:26

iconv? =\
מעניין :P

Meir 01-04-07 09:30

הפתרון פשוט: http://il2.php.net/manual/en/ref.mbstring.php

בניה 01-04-07 09:35

אפשר להמיר את המחרוזת לקידוד רגיל, לעבוד עליה ואז להמיר לUTF8(אפשרי אם יש בה רק עברית ואנגלית)
ויש בPHP
http://www.php.net/manual/en/ref.mbstring.php
(פונקציות לעבודה על מחרוזות שכל תו אמור להיות 2byte)
רק חבל שזה לא מובנה בתוך המנוע וצריך לאפשר את זה.
וראיתי באתר phpclasses (אתר ששווה להציץ בו תמיד!)
מחלקה שיכולה לעשות את העבודה:
http://www.phpclasses.org/browse/file/16999.html

RS324 01-04-07 11:09

ציטוט:

נכתב במקור על ידי elbaz.maor (פרסם 449534)

ידוע .... הבעיה היא שלא כל שרת תומך בזה ואתה לא יכול לשלב את זה ב PRODUCTION

חיפוש לא ארוך מעלה את התוצאות הבאות :

PHP קוד:

function utf8_substr($str,$from,$len)
{
  return 
preg_replace('#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$from.'}'.
                       
'((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$len.'}).*#s',
                       
'$1',$str);


עבור STRLEN :

PHP קוד:

function utf8_strlen($str)    {
  
$n=0;
  for(
$i=0; isset($str{$i}) && strlen($str{$i})>0$i++)    {
    
$c ord($str{$i});
    if (!(
$c 0x80))    // single-byte (0xxxxxx)
      
$n++;
    elseif ((
$c 0xC0) == 0xC0)    // multi-byte starting byte (11xxxxxx)
      
$n++;
  }
  return 
$n;
}

function 
utf8_strlen($str)
    {
    
$count 0;

    for(
$i 0$i strlen($str); $i++)
        {
        
$value ord($str[$i]);
        if(
$value 127)
            {
            if(
$value >= 192 && $value <= 223)
                
$i++;
            elseif(
$value >= 224 && $value <= 239)
                
$i $i 2;
            elseif(
$value >= 240 && $value <= 247)
                
$i $i 3;
            else
                die(
'Not a UTF-8 compatible string');
            }
       
        
$count++;
        }
   
    return 
$count;
    }

// choice 1
function utf8_strlen($str) {
  
$count 0;
  for (
$i 0$i strlen($str); ++$i) {
    if ((
ord($str[$i]) & 0xC0) != 0x80) {
      ++
$count;
    }
  }
  return 
$count;
}

// choice 2
function utf8_strlen($str) {
  return 
preg_match_all('/[\x00-\x7F\xC0-\xFD]/'$str$dummy);


יש עוד כמה פונקציות שעושות בעיות עם UTF8
כמובן שאם יש MBSTRING זה מומלץ

Startzero.net 01-04-07 15:33

הכי פשוט להשתמש ב Windows-1255, בחיים לא השתמשתי ב UTF8

Unknown 01-04-07 17:52

ציטוט:

נכתב במקור על ידי startzero.net (פרסם 450015)
הכי פשוט להשתמש ב Windows-1255, בחיים לא השתמשתי ב UTF8

פשוט זה ברור, אבל אז האתר שלך יתמוך בשפה אחת בלבד
UTF משמש לרוב לאתרים מרובי שפות, הכנה לריבוי שפות, בחלק מהמקרים קידום אתרים
וגם, מאפשר הרבה יותר אופציות בעתיד

וסתם חוסך עבודה אח"כ

somebody 01-04-07 18:19

אני לא יודע מי אלו כל המתכנתים שאתה מדבר עליהם..
אבל אני עובד עם ASP, ולא נתקלתי בשום בעיה בעבודה עם UTF-8 עם פונקציות מחרוזות.

בניה 01-04-07 18:34

אם אין צורך מיוחד, לדעתי לא כדאי לעבוד עם UTF 8.
כי כל תו בעברית לוקח פי 2 מקום וזה קריטי במיוחד אם שומרים את המידע במסד נתונים ככה.


כל הזמנים הם GMT +2. הזמן כעת הוא 14:31.

מופעל באמצעות VBulletin גרסה 3.8.6
כל הזכויות שמורות ©
כל הזכויות שמורות לסולל יבוא ורשתות (1997) בע"מ