עברית עם PHP ו- MySQL

‏ • 9 בספטמבר, 2005

פתיחה


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

כתבה זאת מתבססת על העובדה שאתם משתמשים בקידוד של windows-1255 רגיל. אם אתה מחליט להשתמש בקידוד UTF-8, הכתבה לא תתאים להגדרות שלך.

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

  • מה להתקין?
  • הבדל בין windows-1255 לבין UTF-8
  • הגדרת עברית בעמוד HTML
  • שימוש ב- RTL בעמוד HTML
  • שימוש עם RTL בהגדרות CSS
  • הגדרת MySQL 4.1+
  • הגדרת PHP 4
  • הגדרת PHP 5
  • הגדרת Apache 2
  • תאריכים בעברית ב- PHP
  • סימני פיסוק ומספרים הפוכים
  • מיון עברית בשאילתות
  • מיון עברית ב- PHP
  • המרת נתונים לקידודים שונים
  • המרת מידע מ- MySQL 4.1+ לגרסאות ישנות יותר
  • מה להתקין


    יש הבדלים בין הגרסאות השונות של הרכיבים.
    עדיף להשתמש ב- Apache 2, MySQL 4.1, ו- PHP 4.
    אם אתם בוחרים להשתמש ב- PHP5, שימו לב להבדלים שיכולים להיות עקב המעבר לקידוד UTF-8.

    הבדל בין windows-1255 לבין UTF-8


    רוב האתרים בישראל עובדים בקידוד רגיל, כלומר ISO-8859-8 או windows-1255. קידוד זה מגדיר לדפדפנים שזהו דף אינטרנט בעברית. ברוב המקרים עדיף להשתמש בקידוד הזה.

    קידוד windows-1255 מאפשר להציג שתי שפות – עברית ואנגלית, ולכן זה מספיק לרוב האתרים בישראל. אם רוצים יותר משתי שפות באתר אחד, עדיף לעבור לקידוד UTF-8.

    כשמדובר באתרים רב-לשוניים, מתכנתים מעדיפים להשתמש בקידוד UTF-8. בקידוד UTF-8 ניתן לשמור כל אות אפשרית שקיימת בעולם, מבלי צורך להתעסק עם קידודים שונים. כמו-כן, אפשר להציג באותו דף את כל השפות הקיימות בעולם ללא התנגשויות של קידודים.

    דוגמא לאתר שעובד ב- UTF-8, הוא אתר google.co.il.

    הגדרת עברית בעמוד HTML


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

    בשביל להגדיר את הקידוד, צריך להשתמש בשני פקודות. תמיד עדיף להשתמש בשתי הפקודות, ולא לבחור רק פקודה אחת.

    את שתי הפקודות צריך להכניס בסקריפט ה- PHP.

    פקודת HEADER
    פקודה זאת מגדירה את הקידוד של העמוד בתוך ה- HEADER של דף האינטרנט.
    לכל דף אינטרנט יש HEADER בו מוגדרים מאפיינים כללים של הדף. אחד מהמאפיינים היא קידוד העמוד, הנקרא Charset.

    1  

    header('Content-Type: text/html; charset=windows-1255');  

    משום שה- HEADER נשלח תמיד לפני דף האינטרנט, צריכים לוודא שפקודה זאת נכתבת לפני כל פלט אחר שנשלח לדפדפן. אם רוצים להיות בטוחים, אפשר לשים את פקודה זאת בתחילת הסקריפט.

    1
    2
    3
    4
    5  

    <?PHP
    header('Content-Type: text/html; charset=windows-1255');
    // more content
    ?>
    

    שליחה של פלט לפני פקודה זאת תגרום לבעיות בסקריפטים, ולהגדרת קידוד לא נכון ע"י PHP עצמו.

    שימו לב שאת ה- HEADER לא ניתן לראות באמצעות "ראיית קוד מקור", כי ה- HEADER לא ממש חלק מהקוד של העמוד, אלא נשלח בנפרד לדפדפן.

    פקודת META
    בניגוד לפקודה הקודמת, פקודה זאת היא חלק מעמוד ה- HTML.

    1  

    <meta HTTP-EQUIV="content-type" CONTENT="text/html; charset=windows-1255" />

    את פקודה זאת צריכים להכניס בתוך תגי <HEAD> של עמוד ה- HTML. לא משנה איפה, העיקר לפני הסגירה של התג <HEAD>.

    פקודה זאת מאוד חשובה, במיוחד כאשר משתמש שומר את הדף למחשב האישי, ששם אין קבלת HEADER מהשרת שלכם.

    שימוש עם RTL בעמוד HTML


    הוראת RTL (Right-To-Left) מגדירה לדפדפן כי החלק הזה של העמוד הוא של שפה מימין לשמאל. ברירת המחדל של HTML הוא כמובן LTR (Left-To-Right), המתאימה לרוב השפות, כמו אנגלית. אם השפה הראשית של העמוד היא עברית, יש להשתמש בהוראת RTL .

    אם אתם רוצים שכל הדף יהיה מימין לשמאל, כולל פס הגרירה (ב- IE בלבד), אפשר להגדיר את תג BODY בצורה הבאה:

    1  

    <body dir="rtl">

    אם רוצים רק חלק מהדף שיוצג מימין לשמאל, אפשר להשתמש בתגי DIV מקומיים, כגון:

    1  

    <div dir="rtl">

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

    שימוש עם RTL בהגדרות CSS


    אם רוצים להגדיר את הכיוון של הדפים דרך הגדרות עיצוב CSS, אפשר להשתמש בהוראה הבאה:

    1
    2
    3  

    body {
    direction: rtl;
    }

    באותו אופן, אפשר להגדיר לכל הדף באמצעות body, או להשתמש בהוראה דרך div, p וכדומה.

    הגדרת MySQL 4.1+


    גרסה 4.1 נחשבת כגרסה יציבה (Stable) ושרתים חדשים עובדים איתה. השינוי הכי חשוב בה מבחינת עברית, היא שכל המידע נשמר בקידוד של UTF-8 ואי אפשר לשנות את זה, אפילו אם ממש רוצים.

    זה לא בעיה, אבל צריך להגדיר שאנחנו עובדים בעברית windows-1255 ולא בעברית UTF-8.

    יש שתי אפשרויות להגדיר זאת, בסקריפט PHP או בהגדרות של המאגר נתונים.
    תמיד עדיף לעשות את זה בהגדרות של המאגר נתונים, אבל לפעמים אין ברירה.

    הגדרת עברית במאגר נתונים באמצעות phpMyAdmin
    נוח להשתמש בתוכנת הניהול של MySQL. אם עדיין אין לכם את זה, הורידו את זה מהאתר http://www.phpmyadmin.net/.

    תוכנה זאת מאפשרת לנהל כמעט הכל בשרת מבחינת מאגר הנתונים.

    בעמוד הראשי המקבל לאחר הפעלת התוכנה, חפשו את הגדרת MySQL connection collation. הגדרה זאת אומרת ל- MySQL באיזה קידוד להוציא לסקריפטים שלכם את המידע. הגדירו את זה כ- hebrew_bin.

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

    הגדרת PHP 4


    הגדרת עברית דרך סקריפט PHP
    אם אתם נתקלים בבעיות של קידוד לא מתאים, אפשר לנסות להשתמש בפקודת SET NAMES ולציין את הקידוד הנכון.

    1  

    mysql_query("SET NAMES 'hebrew_bin'", $con);

    הגדרת PHP 5


    הגדרת עברית דרך סקריפט PHP
    PHP5 עובד כברירת מחדל עם UTF-8, ולכן אם רוצים לבצע שאילתות מהמאגר נתונים, חייבים לציין את הקידוד
    המתאים, במקרה שלנו hebrew.

    בלי הוראה זאת בכל פתיחה של חיבור, במקום עברית ייצאו סימני שאלה!

    1  

    mysql_query("SET NAMES 'hebrew'");

    הגדרת Apache 2


    יש כמה הגדרות בשרת apache שאפשר להגדיר בו, אם השרת מיועד רק לאתרים בעברית. לא מומלץ להגדיר זאת לשרתים שיפעילו אתרים בשפות אחרות.

    ההגדרות נמצאות בתוך קובץ ההגדרות הראשי /conf/httpd.conf

    הוספת קידוד בעברית
    קובץ ההגדרות מכיל רשימה של הקידודים המוכרים ל- Apache.
    בדקו שהוא מכיל את הקידוד של עברית רגילה:

    1  

    AddCharset WINDOWS-1255 .cp-1255 .win-1255

    הגדרת עדיפות שפה
    אם לא מוגדרת שפה בדף האינטרנט, Apache יכול להגדיר בעצמו את השפה. על מנת לתת לעברית עדיפות על שפות אחרות, צריך להעביר את המשתנה he יותר שמאלה, תלוי בכם.

    1  

    LanguagePriority he en

    הגדרת קידוד ושפה ברירת מחדל
    אפשר להגדיר את הקידוד והשפה שיהיו ברירת מחדל, במקרה ודפי האינטרנט לא מכילים פקודת קידוד ושפה כלשהי.

    1
    2  

    AddDefaultCharset windows-1255
    DefaultLanguage he

    אפשר להוסיף את פקודות אלו בסוף בעמוד ההגדרות.

    תאריכים בעברית ב- PHP


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

    דבר ראשון, יש להגדיר את השפה של התאריכים, דרך פונקציית setlocale() ולאחר מכן אפשר לייצג תאריכים בעברית בקלות רבה. לדוגמא:

    1
    2
    3
    4
    5
    6
    7  

    <?PHP
    /* Set locale to Hebrew */
    setlocale(LC_ALL, 'he');

    /* Output: יום חמישי דצמבר 2005 */
    echo strftime("%A %e %B %Y", mktime(0, 0, 0, 12, 22, 2005));
    ?>

    לכל האפשרויות של פונקציית strftime() אפשר לראות את התיעוד של הפונקציה באתר הרשמי של PHP (http://il.php.net/strftime).

    החסרון כאן, שיש שרתים שלא כוללים תאריכים בעברית וכדאי לנסות להריץ סקריפט דוגמא על השרת לפני שמתחילים לעבוד עם האפשרות הזאת.

    סימני פיסוק ומספרים הפוכים


    לפעמים, יש מצב שבו סימני הפיסוק או סימנים אחרים יוצאים הפוך בגלל הוראת RTL. אפשר לסדר את זה באמצעות שימוש בתג SPAN.

    לדוגמא, אם כותבים כנסו אל http://www.php.net/, הסימן האחרון יוצא הפוך.
    כתיבה עם תג SPAN מסדרת את הסימן האחרון ע"י הגדרת כיוון התג משמאל לימין:

    מצב לא נכון:

    1  

    כנסו אל http://www.php.net/.<br />

    תוצאה: כנסו אל http://www.php.net/.

    מצב נכון:

    1  

    כנסו אל <span dir="ltr">http://www.php.net/</span>.<br />

    תוצאה: כנסו אל http://www.php.net/.

    או דוגמא עם תאריך שנכנס אחרי מילה באנגלית:

    מצב לא נכון:

    1  

    כתבת PHP – 22/12/2005

    תוצאה: כתבת PHP – 22/12/2005

    מצב נכון:

    1  

    כתבת PHP <span dir="rtl"> – 22/12/2005</span>

    תוצאה: כתבת PHP – 22/12/2005.

    מיון עברית בשאילתות SQL


    משום ש- MySQL 4.1 שומר מידע ב- UTF-8, הוא יסדר עברית בצורה נכונה.
    שליפת מידע באמצעות שאילתה תהיה מוסדרת לפי ABC ולאחר מכן לפי אבג, אם יש גם רשומות באנגלית ובעברית.

    1  

    SELECT members.name FROM members ORDER BY name

    לעומת זאת, הגרסאות הישנות יותר של MySQL עושות בעיות עם סידור עברית, אם אין הגדרות נכונות.

    מיון עברית ב- PHP


    מיון מערכים שהתוכן שלהם בעברית יכול להתבצע ע"י פונקציית sort() הרגילה.
    דוגמא:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15  


    $array = Array();
    $array[] = 'שלמה';
    $array[] = 'צחי';
    $array[] = 'הדר';
    $array[] = 'לירון';
    $array[] = 'משה';
    $array[] = 'אהרון';
    $array[] = 'תמר';

    sort($array);
    reset($array);
    while (list($key, $val) = each($array)) {
    echo "fruits[" . $key . "] = " . $val . "\n";
    }

    המרת נתונים לקידודים שונים


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

    לדוגמא, כל המידע שנשמר במודולים של PEAR, שמור בקידוד UTF-8 וחייבים להמיר אותו לקידוד windows-1255 אם רוצים להציג אותו ולהשתמש בו.

    פונקציית iconv() מעבירה String מקידוד אחד לשני.
    על מנת להעביר String מקידוד UTF-8 אל windows-1255:

    1
    2
    3
    4  


    <?php
    echo iconv("UTF-8", "windows-1255", $utfstring);
    ?>

    בשביל לעשות העברה אל UTF-8, אפשר להחליף את סדר הקידודים בפונקציה, או להשתמש בפונקציית utf8_encode().

    המרת מידע מ- MySQL 4.1+ לגרסאות ישנות יותר


    חלק מהשרתים בארץ עדיין עובדים עם MySQL 4 או עם MySQL 3.23.

    אם תנסו לבצע ייצוא של נתונים לקובץ SQL משרת MySQL 4.1 ולייבא אותו לתוך שרת ישן, תתקלו בבעיות.

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

    זה קורה מהעובדה הפשוטה ש- MySQL 4.1 ומעלה עובדים בקידוד UTF-8 והישנים עובדים עם קידודים רגילים.

    הפיתרון הוא להעביר את המידע לקידוד המתאים. כמו-כן, בעמוד הייצוא (EXPORT) שנמצא בתוכנת ה- phpMyAdmin, צריך לשים לב לכמה פרטים:

    תאימות אחורה
    אם רוצים לייצא לשרת ישן יותר, צריך לבחור את התאימות של שאילתות ה- SQL.
    חוץ מעניין ה- UTF-8, יש עוד הרבה דברים שנוספו בגרסה 4 ולכן אם לא צריכים אותם, עדיף להגדיר MYSQL323. תאימות זאת מתאימה לכל השרתים מסוג MYSQL.

    שמירה כמידע בינארי
    המון פעמים אני שוכח להוריד את הסימון של Use hexadecimal for binary fields וזה גורם למידע להישמר בצורה בינארית. חשוב מאוד להוריד את הסימון הזה כאשר מייצאים מידע.

    שמירה כקובץ
    אם המאגר נתונים מכיל הרבה מידע, עדיף לשמור אותו כקובץ מאשר לקבל אותו לדפדפן.

    המרת הקידוד
    הקובץ מתקבל בקידוד UTF-8 ואין אפשרות לשנות את זה דרך הניהול של phpMyAdmin. צריך להשתמש בתוכנה המעבירה את הקידוד ל- windows-1255.
    לדוגמא, דרך פנקס רשימות:

    פתיחת הקובץ השמור בקידוד UTF-8.

    ולאחר מכן שמירתו בקידוד windows-1255 או ANSI.




    המאמר נכתב ע"י הדר פורת
    Keynetik – בניית אתרים

    תגיות: , , , ,

    רן בר-זיק

    מתכנת PHP מנוסה ובעל ידע רב בפיתוח לאינטרנט על בסיס LAMP. מומחה במערכות דרופל, ג'ומלה ו-וורדפרס. שולט היטב בכל מה שקשור לפרונט אנד: JavaScript: jQuery ו-MooTools,ActionScript 2/3 וכמובן HTML 5 + CSS 3.אינטרנט ישראל: www.internet-israel.com

    תגובות בפייסבוק