עברית ו – ASP.NET (או: למה רואים ג'יבריש \ סימני שאלה?)

20 באפריל 2008

תגיות: ,
15 תגובות

אחת השאלות הנפוצות יותר בפורומים של פיתוח אתרים ו ‎.NET היא "מדוע לא רואים עברית?".

בכמה שלבים פשוטים, אפשר לדאוג שלא יהיו בעיות עם העברית באתרכם:

קידוד

הקידוד המומלץ לעבודה ב – Web (ולא רק בו) הוא Unicode, נקודה.

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

לקריאה נוספת:

Visual Studio

בכדי שהדפים שלנו יתמכו ב – Unicode, יהיה עלינו לשמור אותם בקידוד זה.

ב – Visual Studio בחלון Save \ Save As, מופיע ליד כפתור ה – Save חץ קטן, לחיצה עליו תפתח תפריט עם שתי אפשריות, אחת מהן היא Save With Encoding:

חלון שמירה ב - Visual Studio

נבחר באופציה השניה, ויפתח חלון נוסף, בו ניתן לבחור את הקידוד:

VisualStudioSave2 

HTML

כשנשלח דף HTML לדפדפן, יש לידע אותו על הקידוד, אחרת ייתכן והדפדפן יבחר בקידוד שונה (לעתים הקידוד שנקבע בדף האחרון, או ברירת המחדל של הדפדפן).

הגדרת הקידוד של דף HTML מתבצעת באמצעות תג meta:

<meta http-equiv="Content-Type"
    content="text/html; charset=utf-8" />

XML

אם מדובר על קובץ XML (כמו RSS), הקידוד מוגדר בהצהרה שפותחת את המסמך:

<?xml version="1.0" encoding="utf-8"?>

ASP.NET

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

  1. ב – Page Declaration בתחילת כל דף aspx.
  2. ב – Web.Config תחת התגית Globalization.

יש לציין את ה – RequestEncoding, וה – ResponseEncoding.

ב – Web.Config זה יראה כך:

<globalization 
     requestEncoding="utf-8"
     responseEncoding="utf-8"/>

SQL Server

ב – SQL Server ישנם Data Types מיוחדים לשמירת נתונים ב – Unicode. שמם של השדות האלו מתחיל ב – N:

  • NChar – המקביל היוניקודי ל – Char.
  • NVarChar – המקביל של VarChar.
  • NText – המקביל של Text.

ההבדל בין הגרסה ה – Nית, ללא Nית, היא שהשדות שמתחילים ב – N משתמשים בשני בתים בכדי לאחסן תו (בכדי שניתן יהיה לאחסן תו בכל שפה).

יש להשתמש בסוגים אלו בבניית בסיס הנתונים. בנוסף יש לזכור שכל הפרמטרים שמועברים ל – SQL Server צריכים להיות מאותו הסוג.

במידה ולא משתמשים בפרמטרים במשפטי ה – SQL, יש להוסיף את האות N לפני כל String. לדוגמה:

SET MyField = N'Some text';

 

חשוב לזכור שגם אם לא יישמתם את כל הצעדים, ולא נתקלם בבעיות עם העברית במכונת הפיתוח שלכם, ייתכן ובדפדפנים במחשבים אחרים יצוצו בעיות (אם אין תג meta מתאים), בשרת ה – Production יהיו בעיות בזמן ההעלאה, או שהמסד ישמור את הנתונים בצורה לא תקינה (קרה לא מעט), לכן רצוי לטפל בהכל לפני כל פרוייקט.

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *

15 תגובות

  1. Avi Pinto20 באפריל 2008 ב 15:34

    קצר וממצה!

    הגב
  2. DrorEngel20 באפריל 2008 ב 16:01

    עכשיו הפוסט הבא יהיה להסביר מה ההבדל בין UTF8 עם חתימה ובלי חתימה ואיך משתמשים במחלקת encoding

    הגב
  3. אוהד אסטון20 באפריל 2008 ב 17:29

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

    תודה.

    הגב
  4. Maxim22 באפריל 2008 ב 18:16

    אחלה פוסט.
    קידוד זו צרה צרורה, המון מפתחים לא מקדישים לכך מספיק תשומת לב ואח"כ אוכלים אותה במכונות של לקוח.
    ב-VS, ניתן לקבוע מראש באיזה פורמט לשמור את הקבצים, סמנו V באופציה הבאה:
    tools >> options >> environment >> documents >> save documents as unicode when data cannot be saved in
    codepage
    עוד אפשרות של קינפוג:
    tools >> options >> text editor >> general >> auto-detect utf-8 encoding without signature
    עוד עניין בעייתי בהמון מערכות מידע – תאריכים, אכלתי המון קש בגלל פורמטים שונים של תאריכים במחשבי לקוחות.

    הגב
  5. OhadAston24 באפריל 2008 ב 20:28

    תודה

    ולגבי התאריכים, ב – .NET Framework אפשר לטפל יופי בתאריכים, גם לזה אני אקדיש פוסט.

    הגב
  6. Sirmoreno19 ביוני 2008 ב 9:59

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

    string filename = GetSubString(filepath,filepath.LastIndexOf("\\") + 1, filepath.Length – filepath.LastIndexOf("\\") – 1);
    Response.Clear();

    Response.ContentType = "application/octet-stream";
    Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);

    System.IO.FileInfo fileInfo = new System.IO.FileInfo(filepath);
    Response.AppendHeader("Content-Length", fileInfo.Length.ToString()); //Sends only the File with no Extra bytes

    Response.Flush();

    Response.WriteFile(filepath);

    Response.Flush();

    כששם הקובץ מכיל תווים בעברית הם נהרסים,
    למרות שאת תוכן הקובץ המשתמש רואה מצויין
    ניסיתי:

    Response.ContentEncoding = System.Text.Encoding.UTF8; //for Hebrew

    Response.HeaderEncoding = System.Text.Encoding.UTF8; //for Hebrew

    וגם:

    Response.ContentEncoding = System.Text.Encoding.GetEncoding("windows-1255"); //for Hebrew

    Response.HeaderEncoding = System.Text.Encoding.GetEncoding("windows-1255"); //for Hebrew

    אבל לא פתר את הבעיה.
    כל רעיון יכול לעזור.
    תודה

    הגב
  7. אריאל6 ביולי 2008 ב 9:39

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

    הגב
  8. תומר25 באוגוסט 2009 ב 11:37

    איך אני פותר את בעיית הג'יבריש כאשר השדות במסד הנתונים מוגדרים כ- iso-8859-8-i ואינני מעוניין לשנות כלום במסד נתונים?

    הגב
  9. תמיר20 באפריל 2010 ב 9:40

    כל הכבוד!!!!

    מסביר ופותר הרבה כאבי ראש.
    יישר כח!!

    הגב
  10. איך לראות עברית ב csv9 במאי 2010 ב 19:09

    Response.ContentEncoding = Encoding.GetEncoding(1255);

    הגב
  11. אולי מישהוא יכול לעזור10 במאי 2010 ב 11:08

    יש לנו אתר שמתבסס על SQL SERVER 2005 וASP.NET
    הוא מתפקד בסדר.
    רוצים לעבור ל SQL SERVER 2008
    רוב הטקסט באתר נראה בסדר. והשדות של text מגיעים לסרבר מה DB בתור סימני שאלה במקום עברית. עם השדות שהם nvarchar – הכל בסדר. ה collation של הDB SQL_Latin1_General_CP1255_CI_AS
    בWeb.config הכל מסודר ל Utf-8
    התקנו SQL 2008 ועשינו attach לבסיסי נתונים.
    יש למישהוא רעיון איך פותרים?

    הגב
  12. mama13 בדצמבר 2010 ב 22:13

    איזה כיף, תודה על המאמר, פתר לי את הבעיה

    הגב
  13. יונתן20 ביוני 2011 ב 10:37

    יש לי אפליקציית ASP.NET שתפקידה לשלוח מיילים.
    אם אני מצרף Attachment ששם הקובץ הוא בעברית, ואורכו עולה על 20 תווים, הקובץ כולו משתבש.
    ניסית לעשות את הדברים הבאים:
    att.NameEncoding = System.Text.Encoding.GetEncoding(1252)
    וגם
    att.NameEncoding = System.Text.Encoding.GetEncoding(1255)

    ושום דבר לא עזר, יש למישהו רעיון?

    הגב
  14. ליאור23 באוקטובר 2011 ב 14:37

    תודה רבה ! המאמר שלך עזר לי לאחר הרבה נסיונות האבקות מתישים עם ASP.NET

    הגב
  15. עודד6 בינואר 2012 ב 9:27

    לא מצליח לראות עברית!

    הגב