הבדלים בקידוד אימיילים בעברית של GMail - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

הבדלים בקידוד אימיילים בעברית של GMail


Milford Cubicle

Recommended Posts

היי,

יש פה משהו שלא כלכך ברור לי..

[שפה: PHP]

אני מנתח אימיילים שנשלחו ע"י , בעברית.

ה-body בכל המקרים מקודד ב-base64, עם זה אין בעיה.

הבעיה היא עם שדה ה-Subject ב-Headers:

במצב רגיל, מקודד גם אותו ב-base64.

למשל: "בדיקה" הופך ל: =?UTF-8?B?15HXk9eZ16fXlA==?=

כמו כן, אין בעיה לשלב עברית ואנגלית.

למשל: "Re: בדיקה" הופך ל: =?UTF-8?B?UmU6INeR15PXmden15Q=?=

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

למשל: "בדיקה 12:30" הופך ל: =?UTF-8?Q?=D7=91=D7=93=D7=99=D7=A7=D7=94_12:30?=

שימו לב שה-prefix עדיין מציין UTF-8, אבל הפעם במקום UTF-8?B הוא משתמש ב UTF-8?Q.. יש שם Q במקום B.

מה זה? מה ההבדל?

ההימור שלי הוא ש-B מסמל בינארי.. אבל מה זה Q, ואיך אני מקודד את זה חזרה?

הקידוד הזה נורא דומה לקידוד -1255, שבשבילו פשוט כתבתי פונקציה שממירה אות-אות:

function windows_1255_decode($text)
{
$letters_array = array (
'=E0' => 'א',
'=E1' => 'ב',
'=E2' => 'ג',
'=E3' => 'ד',
'=E4' => 'ה',
'=E5' => 'ו',
'=E6' => 'ז',
'=E7' => 'ח',
'=E8' => 'ט',
'=E9' => 'י',
'=EB' => 'כ',
'=EC' => 'ל',
'=EE' => 'מ',
'=F0' => 'נ',
'=F1' => 'ס',
'=F2' => 'ע',
'=F4' => 'פ',
'=F6' => 'צ',
'=F7' => 'ק',
'=F8' => 'ר',
'=F9' => 'ש',
'=FA' => 'ת',
'=ED' => 'ם',
'=EF' => 'ן',
'=F3' => 'ף',
'=EA' => 'ך',
'=F5' => 'ץ',
);

return strtr($text,$letters_array);
}

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

כשניסיתי לגלות אותם, ובדקתי הודעה עם הכותרת: "אבגדהוזחטיכלמנסעפצקרשתםןףךץ 12:30", ג'ימייל החליט לקודד אותו כרגיל עם UTF-8?B.. ככה:

=?UTF-8?B?15DXkdeS15PXlNeV15bXl9eY15nXm9ec157XoNeh16I=?= =?UTF-8?B?16TXpten16jXqdeq153Xn9ej15rXpSAxMjozMA==?=

הנחתי שזה אולי ארוך מדיי, וניסיתי: "אבגדהוזחטיכ 12:30" , אבל גם פה התקבלה תוצאה דומה:

=?UTF-8?B?15DXkdeS15PXlNeV15bXl9eY15nXmyAxMjozMA==?=

בשאר ה-headers אין רמז נוסף כלשהו לשיטת הקידוד...

יש למישהו מושג מה זה הקידוד המוזר הזה? מה זה אותו UTF-8?Q ולמה משתמשים בו במקום ב-UTF-8?B הרגיל עם קידוד base64 ?

תודה מראש :)

עריכה:

אממ, אוקיי, ע"י חלוקה למספר הודעות עם 5 אותיות בכותרת של כל הודעה (למשל "אבגדה 12:30"), הצלחתי לקבל נתונים כדי ליצור "טבלת המרה", ואני עובד עליה עכשיו..

אבל עדיין, אני אשמח לקבל הסברים על הנושא הזה למקרה שמישהו יודע.. אולי יש דרך פשוטה יותר :)

קישור לתוכן
שתף באתרים אחרים

למעוניינים, הנה פונקציית ההמרה של הפורמט המשונה הזה:


function utf_8_q_decode($text)
{
$letters_array = array (
'=90' => 'א',
'=91' => 'ב',
'=92' => 'ג',
'=93' => 'ד',
'=94' => 'ה',
'=95' => 'ו',
'=96' => 'ז',
'=97' => 'ח',
'=98' => 'ט',
'=99' => 'י',
'=9B' => 'כ',
'=9C' => 'ל',
'=9E' => 'מ',
'=A0' => 'נ',
'=A1' => 'ס',
'=A2' => 'ע',
'=A4' => 'פ',
'=A6' => 'צ',
'=A7' => 'ק',
'=A8' => 'ר',
'=A9' => 'ש',
'=AA' => 'ת',
'=9D' => 'ם',
'=9F' => 'ן',
'=A3' => 'ף',
'=9A' => 'ך',
'=A5' => 'ץ',
);

$text = str_replace('=D7','',$text);

return strtr($text,$letters_array);
}

(התו =D7 משום מה סתם מופיע בין כל תו ותו..)

קישור לתוכן
שתף באתרים אחרים

אני עשיתי זאת בצורה הבאה:

רשמתי פונקציה ששולפת מה header של המייל כמה פרמטרים שאני צריך ובינהם גם את ה charset של ההודעה.

לאחר מכן:

iconv_set_encoding("internal_encoding", $charset);
iconv_set_encoding("output_encoding", "Windows-1255");
ob_start("ob_iconv_handler");

your program here....

ob_end_flush();

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

קישור לתוכן
שתף באתרים אחרים

השאלה היא אם זה ידע לטפל במידע מקודד..

ההבדלים פה הם מעבר ל-charset, מדובר בטקסט מקודד שצריך לעבור decode כדי להיות קריא.

לפי מה שאני מבין הקוד הנ"ל פשוט ממיר מ-charset מסויים ל--1255, זו המרה נוספת שאני גם עושה (עם כי בצורה קצת שונה) אבל היא לא קשורה לקידוד של ההודעה..

צריך להביל בין "קידוד" Charset ובין "קידוד" של הטקסט..

אני לא מדבר על המרות charset אלא על סוג של "הצפנה" ו"פיענוח" של טקסט..

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

טיפלתי בזה ע"י ריקורסיה:


<?php
if ((substr_count($org_subject_str, '=?UTF-8?B?') > 1) && ($no_rec == false))
{ // we have the subject in two (or more) separated parts!
$parts = explode('=?UTF-8?B?', $org_subject_str);
for ($i=1; $i<count($parts); $i++)
{ // first we work on the first part by Recursion, than add the second part and so on
$subject_str .= parse_subject('=?UTF-8?B?'.$parts[$i], 'true'); // true for 'no Recursion';
}
}
else
$subject_str = $org_subject_str;

// keep working on the subject...
?>

קישור לתוכן
שתף באתרים אחרים

אני מעבד את המיילים ב php לאחר שהם עברו דרך התוכנה ripmime אם אני לא טועה.

זה מפרק לי את המייל למספר קבצים: _headers_, body_text-plain0, body_text-plain1 ואם יש צרופות אז גם אותן.

ייתכן ו ripmime עושה להם איזהו decode לפני אבל אני לא סגור על זה.

אני כן זוכר בוודאות שהייתה לי בעיה עם מיילים מ והקוד שרשמתי לך פתר אותה (גם קיבלתי טקסט מקושקש כמו שקיבלת)

לגבי הנושא לא נתקלתי בזה, כמה אורכה הייתה הכותרת ? ואיך אתה קורא את המיילים בתוך ה php ?

קישור לתוכן
שתף באתרים אחרים

59 תווים.

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

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

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

קישור לתוכן
שתף באתרים אחרים

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

http://developer.apple.com/documentation/Darwin/Reference/ManPages/man3/Encode__MIME__Header.3pm.html

http://il.php.net/quoted_printable_decode

http://en.wikipedia.org/wiki/Quoted-printable

http://www.faqs.org/rfcs/rfc2045.html

B = Base64

Q = Quotable-printable

=?UTF-8?Q?=D7=91=D7=93=D7=99=D7=A7=D7=94_12:30?=

מכיוון שזה UTF-8 אז 2 האותיות הראשונות, שהם D7 ו 91 בהקס, מסמלים את האות ב' למשל.

קישור לתוכן
שתף באתרים אחרים

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

×
  • צור חדש...