אימגו מגזין מאמרים

כתב עת בנושאי תרבות ותוכן

המרת קידוד אתר ל utf-8


תאריך פרסום קודם: 
02/07/2007
מחבר: 
ניסים עינת

העולם מרובה בשפות, בין אם הסיבה היא קללתו של אלוהים עת בנו בני האדם את מגדל בבל ובין אם לא, זו עובדה שיש הרבה שפות והרבה סוגי כתב ואותיות בעולם. קצת על קידודים: כאשר מחשב מציג טקסט מסוים, הוא שולף אותו מן הסתם מין הזיכרון. אך מה יש בדיוק בזכרונו של המחשב? כיצד שמורות האותיות? הצורה האופטימליות לבצע שמירה וניהול זה של מידע חזותי נעשה על ידי הגדרת קידודים והגדרות קרקטרים: Encoding and character sets קידוד משמעו שביצוע התאמה בין אותיות ושמלים לבין ספרות, אולי הקידוד המפורסם ביותר הוא קוד ה ascii, קוד ה ascii מבצע התאמה בין מידע המאוחסן ב 7 סיביות (7 bytes) לבין אות, מאחר שב 7 סיביות ניתן לאסן 128 אפשרויות, טבלת ה ascii מכילה 128 אותיות+ סמלים מיוחדים כפי שניתן לראות בטבלה הזו. מאחר שקידוד ה ascii נעזר ב 7 סיביות ליצוג אות, הרי שמרחב האפשרויות כאמור הוא רק 128 וברור כין אפשרות ליצג בעזרת קידוד זה תווים ואותיות של שפות רבות, בכדי לענות על צורך זה פותחו קידוים אוניברסלים (Unicode) שהפופולרי שבהם הוא קידוד ה utf-8 קידוד זה מאפשר יצוג של כמעט כל השפות האנושיות, בנוסף קידוד utf-8 הוא קונסיטנטי עם קידודה ascii (כלומר תוי ה ascii מקבלים את אותו ערך בינאיר בשני הקידוים), שתי עובדות אלו הפכו אותו לפופולרי ואט אט הופך קידוד זה לסטנדרט בתעשיה. לאחר הסבר קצר זה ניגש לבעיות פרקטיות מהעולם האמיתי של האינטרנט וניראה כיצד ניתן להתמודד איתן בעזרת שפת PHP ו-בסיס נתונים mysql: המטרה: נניח ואנו רוצים לשנות קידוד של אתר שלם מ 1255 ל utf-8. נתחיל מבסיס הנתונים, את בסיס הנתונים שלנו ששמור ב קידוד windows-1255 (שמבוסס של ansii ) נדרש להמיר לקידוד utf-8. בכדי להיות מסוגלים לבצע מסימה זו, ראשית עלינו לברר האם בסיס הנתונים תומך בקידוד זה. בסיס נתונים mysql תומך ב קידוד utf-8 רק מגירסת 4.

x. יש לבצע יצוא של הטבלאות מבסיס הנתונים הישן אל המחשב האישי, לאחר מכן עלינו לבצע יבוא של טבלאות אלו מבסיס הנתונים החדש שתומך בutf-8 והוגדר לו קידוד ברירת החדל קידוד utf-8, בהנחנה ואנו מבצעים פעולת היבוא בעזרת תוכנת phpMyadmin , שימו לב שבשלב היבוא ניתנת האפשרות לבחור את הקידוד של הטבלאות המיובאות בחרו קידוד ascii ובצעו העלאה של הטבלאות. במידה והגרתם את הקידוד של השרת כקידוד utf-8בצורה נכונה, המרת הקידוד תתבצע על ידי שרת הmysql בעצמו. לאחר ביצוע המרה מוצלח של בסיס הנתונים, יש לדאוג גם שקבצי האתר עצמו יומרו לקידוד utf-8, שנוי הקידוד מתבצע בקלות – כל שעלכם לעשות הוא לפתוח את הקובץ בעזרת notepad ולשמור אותו שוב בקידוד utf-8 save as… and select encoding to utf-8 לאחר שמירת הקבצים בקידוד utf-8, המעבר כמעט הושלם, תוכלו להעלות את הקבצים לשרת - לא לשכוח להגדיר בתגית ה HTML את הקידוד החדש: [meta charset="utf-8" http-equiv="Content-Type" content="text/html;" /] יתכן בהחלט שתיתכלו בעיות מעצבנות מדי פעם, הסיבה לכך היא שליחת מידע לפני סיום שליחת ההדרים של דף ה HTML. המידע שנשלח הוא תופעה לא רצויה שנגרמה על ידי שמירת הקבצים בקידוד utf-8 בעזרת notepad, אישית לא ברורה לי התופעה הזו והתעצלתי לחפש תוכנות אחרות שיוכלו לבצע את ההמרה מבלי לייצר תופעה בלתי רצויה זו. התופעה הבלתי רצויה היא למעשה תו שמסמל את תחילתו של הדף BOM - beginning of the document תצטרכו לבצע הסרה של תו זה בעזרת עורך טקסט אשר מציג תו זה (ב notepad התו הינו בלתי ניראה ולכן לא ניתן להסירו) תוכנה שבה ניתן לבצע את ההסרה היא HAPedit אשר ניתנת להורדה בחינם, לאחר פתיחת מסמך השמור ב קידוד utf-8 תוכלו לראות בתחילת השורה הראשונה משהו לא ברור... מחקו אותו ושמרו את הקובץ שנית, הפעם הבעיות יפתרו! בשעה טובה יש לנו אתר בקידוד utf-8! עכשיו עלול להתעורר לנו קושי שלא חשבנו עליו – נאמר שאני היתי רגיל להציג באתרי עדקוני rss מאתרים אחרים שמקודדים בקידוד 1255, עכשיו לאחר המעבר לקידוד החדש, העדקונים מופיעים כ ג´יבריש (בדרך כלל ריבועים לא ברורים..)

מה עושים? איך מתמודים? לשם כך, האנשים הטובים של קהילת הקוד הפתוח שפתחו את שפת ה PHP יצרו עבור מצב זה פונקציה שמאפשרת המרת קידוד מאחד למשנהו! שם הפונקציה הוא iconv, והשימוש בה יעשה בצורה הבאה: המרת קידוד מ widows-1255 לקידוד utf-8 ($text הוא משתנה המכיל עדכון RSS מקודד 1255 בדוגמה שלנו): $text=iconv(‘cp-1255’,’utf-8’,$text) הארגומנט הראשון הוא הקידוד הנכנס, הארגומנט השני הוא הקידוד המתקבל, הארגומנט השלישי הוא המחרוזת (הטקסט). שימו לב שקידוד widows-1255 מוכנס בארגומנט הראשון כ cp-1255 על סמך האינפורמציה לעיל, אנו יכולים לבצע המרה מ utf-8 ל 1255 בקלות (במידה ונירצה לשלוח עדכוני RSS לחברנו שעדין נישאר עם קידוד זה): $text=iconv(‘utf-8’,’ cp-1255’,$text) בעיות נוספות שעלולות לצוץ עקב המעבר הן קיצוץ גדול מידי והשארת תווי ג´יבריש עקב שימוש בפונקציית substr של php , הסיבה לכך נובעת מהאופן בו מתבצע קיצוץ המחרוזת על ידי פונקצית ה substr, הפונקציה אינו מחפשת תוים לקצוץ, אלא בתים (bytes), לכן הקיצוץ יהיה גדול ממה שהיה בעבר (קידוד UTF-8 משתמש ביות זיכרון) וגם יתכן סיום קיצוץ באמצע תו, כך שאנו נישארים עם שבר תו שאינו ברור למחשב ולכן הוא מוצג כ ג´יבריש. פתרון לבעיה זו הוא שימוש בפונקצית mb_substr שמבצעץ קיצוץ על סמך התווים ולכן תבצע את העבודה כנדרש!

Add new comment

CAPTCHA

This question is for testing whether you are a human visitor and to prevent automated spam submissions.

Fill in the blank.

הנצפים ביותר

מאמרים נוספים מאת ניסים עינת

.