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

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

Jenya 04-05-12 13:54

בעיית קידוד utf-8 עברית ב-mysql
 
http://up353.siz.co.il/up1/tofhm1ythmlg.jpg

אני כותב, עורך, מוחק נתונים מהמסד דרך קבצי php, כל הקבצים מקודדים utf-8 without bom

כל המסדים utf-8 general ci

עכשיו איפה שיש את ה- $times זה כאשר אני מוסיף נתונים, והם מופיעים אצלי בתור ×�×�×�ש×�×�

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

מה אפשר לעשות בקשר לזה? מישהו נתקל בזה בעבר?

* כמובן שיש גם meta שמגדיר utf-8 ב-header שכלול בכל העמודים...

Itay 04-05-12 15:06

תריץ לפני כל השאילתות שלך את השאילתה הזאת:
קוד:

SET NAMES utf8;
המלצה שלי - פשוט תריץ אותה בקובץ שנמצא החיבור הכללי לדאטהבייס (בהנחה שיש אחד שאתה עושה לו אינקלוד) ישר אחרי הבחירה של הדאטהבייס

Jenya 04-05-12 15:52

ציטוט:

נכתב במקור על ידי Itay (פרסם 843414)
תריץ לפני כל השאילתות שלך את השאילתה הזאת:
קוד:

SET NAMES utf8;
המלצה שלי - פשוט תריץ אותה בקובץ שנמצא החיבור הכללי לדאטהבייס (בהנחה שיש אחד שאתה עושה לו אינקלוד) ישר אחרי הבחירה של הדאטהבייס

הוספתי את זה מתחת ל mysql_connect וללא שינוי |:

ככה זה נראה בדיוק:
HTML קוד:

  if(!(@mysql_connect("$host","$user","$pass") && @mysql_select_db("$tablename"))) {
    mysql_query("SET CHARACTER SET 'utf8'");


NoBoDy 05-05-12 10:56

ציטוט:

נכתב במקור על ידי Jenya (פרסם 843422)
הוספתי את זה מתחת ל mysql_connect וללא שינוי |:

ככה זה נראה בדיוק:
HTML קוד:

  if(!(@mysql_connect("$host","$user","$pass") && @mysql_select_db("$tablename"))) {
    mysql_query("SET CHARACTER SET 'utf8'");


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

Jenya 05-05-12 12:07

ציטוט:

נכתב במקור על ידי Nir berko (פרסם 843492)
הוא אמר לך לכתוב SET NAMES utf8 ולא SET CHARACTER SET 'utf8'.
אם אתה כותב את זה ועדיין לא עובד לך, תנסה למחוק את הטבלה ולהכניס לשם כמה פעמים, גם לי זה קורה ואחרי שאני מכניס כמה פעם תוכן, זה מסתדר.

צודק, תיקנתי...

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

אדיר 05-05-12 12:37

כדי שמסד הנתונים יעבוד באופן מלא תחת utf8_general_ci, להלן מס' דברים שיש לבצע ואפשר גם דרך ה- phpMyAdmin -
1. בלשונית של ה- host אתה מגדיר את ה- MySQL connection collation כ- utf8_general_ci.
2. בלשונית של ה- database הרלוונטי, אתה נכנס ל- Operations ומגדיר את ה- Collation כ- utf8_general_ci.
3. בלשונית של ה- table הרלוונטית, אתה נכנס ל- Operations ומגדיר את ה- Collation כ- utf8_general_ci.
4. בלשונית של ה- field הרלוונטי (אתה מגיע לשם דרך ה- Structure של הטבלה), אתה מגדיר את ה- Collation כ- utf8_general_ci.
5. בהתחברות למסד הנתונים, אתה שולח בתחילת החיבור את השאילתה SET NAME 'utf8'.

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

Jenya 05-05-12 19:37

ציטוט:

נכתב במקור על ידי xPerfection (פרסם 843496)
כדי שמסד הנתונים יעבוד באופן מלא תחת utf8_general_ci, להלן מס' דברים שיש לבצע ואפשר גם דרך ה- phpMyAdmin -
1. בלשונית של ה- host אתה מגדיר את ה- MySQL connection collation כ- utf8_general_ci.
2. בלשונית של ה- database הרלוונטי, אתה נכנס ל- Operations ומגדיר את ה- Collation כ- utf8_general_ci.
3. בלשונית של ה- table הרלוונטית, אתה נכנס ל- Operations ומגדיר את ה- Collation כ- utf8_general_ci.
4. בלשונית של ה- field הרלוונטי (אתה מגיע לשם דרך ה- Structure של הטבלה), אתה מגדיר את ה- Collation כ- utf8_general_ci.
5. בהתחברות למסד הנתונים, אתה שולח בתחילת החיבור את השאילתה SET NAME 'utf8'.

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

עשיתי כל מה שרשמת לי, תודה.

לגבי סעיף 1, איך אני מגיע ללשונית host?

בדקתי, בכל מקום שאפשר להגדיר קידוד במסד מוגדר utf8_general_ci, הדפים מקודדים utf-8 without BOM ויש ב-header שורת meta שמגדירה לדפדפן על הקידוד.

בכל מקרה, כשאני מוסיף הוא מראה לי עדיין משהו בסגנון הזה:
קותי סבג
(זה מה שמופיע במסד, ומופיע באתר כ- ×§×�ת×� ס×�×�)

לעומת זאת, כשאני עורך את אותה רשומה, מופיע לי משהו כזה:
לייק
(זה מה שמופיע במסד, באתר מופיע עברית תקנית)

אני ממש אובד עצות, אני לא יודע מה לעשות |עצוב|

תיקון:

עליתי על הבעיה, אחת הפונקציות השתמשה ב-htmlspecialchars, ומפה נבעה הבעיה. תיקנתי את זה ע"י:
htmlspecialchars($string, ENT_QUOTES, 'UTF-8')

תודה על העזרה!

אדיר 05-05-12 20:09

ה- host זאת הלשונית הראשית.

בהמשך לבעיה -
נדמה שאתה לא מגדיר כמו שצריך את הקידוד של הדפים או לחילופין מבצע פעולה כלשהי על הטקסט שגורמת לכך.
האם אתה מכניס את הנתונים (או מעביר אותם) באמצעות AJAX? האם אתה מבצע include לדפים מסויימים שייתכן ואינם מקודדים כ- utf8?
יש הרבה דברים שיכולים לגרום לזה, קצת קשה לתת תשובה מדוייקת בצורה הזאת.

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

Itay 05-05-12 21:01

ציטוט:

נכתב במקור על ידי xPerfection (פרסם 843496)
כדי שמסד הנתונים יעבוד באופן מלא תחת utf8_general_ci, להלן מס' דברים שיש לבצע ואפשר גם דרך ה- phpMyAdmin -
1. בלשונית של ה- host אתה מגדיר את ה- MySQL connection collation כ- utf8_general_ci.
2. בלשונית של ה- database הרלוונטי, אתה נכנס ל- Operations ומגדיר את ה- Collation כ- utf8_general_ci.
3. בלשונית של ה- table הרלוונטית, אתה נכנס ל- Operations ומגדיר את ה- Collation כ- utf8_general_ci.
4. בלשונית של ה- field הרלוונטי (אתה מגיע לשם דרך ה- Structure של הטבלה), אתה מגדיר את ה- Collation כ- utf8_general_ci.
5. בהתחברות למסד הנתונים, אתה שולח בתחילת החיבור את השאילתה SET NAME 'utf8'.

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

רק שתכיר - ראיתי כבר כמה דאטהבייסים שהיו מוגדרים על latin, אבל השדות היו על utf8 general ci, וברגע שהיה את ה-set names הכל עבד כמו שצריך (מן הסתם אין סיבה להשאיר את זה על latin - אבל בכל זאת זה עובד)

אדיר 05-05-12 21:34

ציטוט:

נכתב במקור על ידי Itay (פרסם 843545)
רק שתכיר - ראיתי כבר כמה דאטהבייסים שהיו מוגדרים על latin, אבל השדות היו על utf8 general ci, וברגע שהיה את ה-set names הכל עבד כמו שצריך (מן הסתם אין סיבה להשאיר את זה על latin - אבל בכל זאת זה עובד)

אני לא מבין את הפואנטה כאן..

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


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

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