עברית עם PHP ו- MySQL
פתיחה
עברית יכולה לעשות צרות לא קטנות אם לא מגדירים את הקידוד כראוי בכל המקומות. כתבה זאת מסבירה איך להגדיר עברית בכל המקומות הדרושים בשביל להימנע מבעיות של ג'יבריש, סימני פיסוק הפוכים וסידור אבג של עברית לא נכון.
כתבה זאת מתבססת על העובדה שאתם משתמשים בקידוד של windows-1255 רגיל. אם אתה מחליט להשתמש בקידוד UTF-8, הכתבה לא תתאים להגדרות שלך.
לפני שהמציאו את הוראת RTL, היה קידוד מוזר בשם עברית ויזואלית. קידוד זה בעצם הפך את סדר האותיות בעברית, והיה סיוט רציני להשתמש בו. מטעמי תאימות לאחורה, שפת PHP עדיין כוללת את הפונקציות להפיכת טקסט עברי. מאוד לא מומלץ להשתמש בקידוד הזה.
מה להתקין
יש הבדלים בין הגרסאות השונות של הרכיבים.
עדיף להשתמש ב- 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 נשלח תמיד לפני דף האינטרנט, צריכים לוודא שפקודה זאת נכתבת לפני כל פלט אחר שנשלח לדפדפן. אם רוצים להיות בטוחים, אפשר לשים את פקודה זאת בתחילת הסקריפט.
1 2 3 4 5 |
|
שליחה של פלט לפני פקודה זאת תגרום לבעיות בסקריפטים, ולהגדרת קידוד לא נכון ע"י PHP עצמו.
שימו לב שאת ה- HEADER לא ניתן לראות באמצעות "ראיית קוד מקור", כי ה- HEADER לא ממש חלק מהקוד של העמוד, אלא נשלח בנפרד לדפדפן.
פקודת META
בניגוד לפקודה הקודמת, פקודה זאת היא חלק מעמוד ה- HTML.
1 |
|
את פקודה זאת צריכים להכניס בתוך תגי <HEAD> של עמוד ה- HTML. לא משנה איפה, העיקר לפני הסגירה של התג <HEAD>.
פקודה זאת מאוד חשובה, במיוחד כאשר משתמש שומר את הדף למחשב האישי, ששם אין קבלת HEADER מהשרת שלכם.
שימוש עם RTL בעמוד HTML
הוראת RTL (Right-To-Left) מגדירה לדפדפן כי החלק הזה של העמוד הוא של שפה מימין לשמאל. ברירת המחדל של HTML הוא כמובן LTR (Left-To-Right), המתאימה לרוב השפות, כמו אנגלית. אם השפה הראשית של העמוד היא עברית, יש להשתמש בהוראת RTL .
אם אתם רוצים שכל הדף יהיה מימין לשמאל, כולל פס הגרירה (ב- IE בלבד), אפשר להגדיר את תג BODY בצורה הבאה:
1 |
|
אם רוצים רק חלק מהדף שיוצג מימין לשמאל, אפשר להשתמש בתגי DIV מקומיים, כגון:
1 |
|
ההוראה הזאת מתקנת את עניין הניקוד המתהפך, שילוב של עברית ואנגלית וכדומה.
מאוד לא מומלץ להציג עברית ללא RTL, במיוחד שכל הדפדפנים תומכים באפשרות זאת.
שימוש עם RTL בהגדרות CSS
אם רוצים להגדיר את הכיוון של הדפים דרך הגדרות עיצוב CSS, אפשר להשתמש בהוראה הבאה:
1 2 3 |
|
באותו אופן, אפשר להגדיר לכל הדף באמצעות 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 |
|
הגדרת PHP 5
הגדרת עברית דרך סקריפט PHP
PHP5 עובד כברירת מחדל עם UTF-8, ולכן אם רוצים לבצע שאילתות מהמאגר נתונים, חייבים לציין את הקידוד
המתאים, במקרה שלנו hebrew.
בלי הוראה זאת בכל פתיחה של חיבור, במקום עברית ייצאו סימני שאלה!
1 |
|
הגדרת Apache 2
יש כמה הגדרות בשרת apache שאפשר להגדיר בו, אם השרת מיועד רק לאתרים בעברית. לא מומלץ להגדיר זאת לשרתים שיפעילו אתרים בשפות אחרות.
ההגדרות נמצאות בתוך קובץ ההגדרות הראשי /conf/httpd.conf
הוספת קידוד בעברית
קובץ ההגדרות מכיל רשימה של הקידודים המוכרים ל- Apache.
בדקו שהוא מכיל את הקידוד של עברית רגילה:
1 |
|
הגדרת עדיפות שפה
אם לא מוגדרת שפה בדף האינטרנט, Apache יכול להגדיר בעצמו את השפה. על מנת לתת לעברית עדיפות על שפות אחרות, צריך להעביר את המשתנה he יותר שמאלה, תלוי בכם.
1 |
|
הגדרת קידוד ושפה ברירת מחדל
אפשר להגדיר את הקידוד והשפה שיהיו ברירת מחדל, במקרה ודפי האינטרנט לא מכילים פקודת קידוד ושפה כלשהי.
1 2 |
|
אפשר להוסיף את פקודות אלו בסוף בעמוד ההגדרות.
תאריכים בעברית ב- PHP
שפת PHP כוללת בתוכה תאריכים בעברית, כולל ימים וחודשים בעברית.
אין צורך להשתמש בשיטות חיצוניות כמו מערכים וכדומה על מנת להציג תאריכים בעברית.
דבר ראשון, יש להגדיר את השפה של התאריכים, דרך פונקציית setlocale() ולאחר מכן אפשר לייצג תאריכים בעברית בקלות רבה. לדוגמא:
1 2 3 4 5 6 7 |
|
לכל האפשרויות של פונקציית strftime() אפשר לראות את התיעוד של הפונקציה באתר הרשמי של PHP (http://il.php.net/strftime).
החסרון כאן, שיש שרתים שלא כוללים תאריכים בעברית וכדאי לנסות להריץ סקריפט דוגמא על השרת לפני שמתחילים לעבוד עם האפשרות הזאת.
סימני פיסוק ומספרים הפוכים
לפעמים, יש מצב שבו סימני הפיסוק או סימנים אחרים יוצאים הפוך בגלל הוראת RTL. אפשר לסדר את זה באמצעות שימוש בתג SPAN.
לדוגמא, אם כותבים כנסו אל http://www.php.net/, הסימן האחרון יוצא הפוך.
כתיבה עם תג SPAN מסדרת את הסימן האחרון ע"י הגדרת כיוון התג משמאל לימין:
מצב לא נכון:
1 |
|
תוצאה: כנסו אל http://www.php.net/.
מצב נכון:
1 |
|
תוצאה: כנסו אל http://www.php.net/.
או דוגמא עם תאריך שנכנס אחרי מילה באנגלית:
מצב לא נכון:
1 |
|
תוצאה: כתבת PHP – 22/12/2005
מצב נכון:
1 |
|
תוצאה: כתבת PHP – 22/12/2005.
מיון עברית בשאילתות SQL
משום ש- MySQL 4.1 שומר מידע ב- UTF-8, הוא יסדר עברית בצורה נכונה.
שליפת מידע באמצעות שאילתה תהיה מוסדרת לפי ABC ולאחר מכן לפי אבג, אם יש גם רשומות באנגלית ובעברית.
1 |
|
לעומת זאת, הגרסאות הישנות יותר של MySQL עושות בעיות עם סידור עברית, אם אין הגדרות נכונות.
מיון עברית ב- PHP
מיון מערכים שהתוכן שלהם בעברית יכול להתבצע ע"י פונקציית sort() הרגילה.
דוגמא:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
המרת נתונים לקידודים שונים
לפעמים אין ברירה, והנתונים מתקבלים בקידוד לא מתאים וצריך להמיר אותם לקידוד הנכון.
לדוגמא, כל המידע שנשמר במודולים של PEAR, שמור בקידוד UTF-8 וחייבים להמיר אותו לקידוד windows-1255 אם רוצים להציג אותו ולהשתמש בו.
פונקציית iconv() מעבירה String מקידוד אחד לשני.
על מנת להעביר String מקידוד UTF-8 אל windows-1255:
1 2 3 4 |
|
בשביל לעשות העברה אל 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 – בניית אתרים
תגובות בפייסבוק