PDA

צפייה בגרסה מלאה : קידוד ופענוח פונט עברית ב BASE64 (שאלה למתכנתים)



מוטי ג.
14-02-19, 22:50
היי,
אנסה את מזלי ואולי פה תמצא התשובה שגוגל לא מוצא לי.
אני צריך לקודד ולפענח טקסט עברית ל BASE64 , בסביבת תוכנה שלא יודעת מה זה ג'אווה או Net. אז אל תשלחו אותי לכל מיני כלים מוכנים להמרה.
אני צריך ממש לכתוב קוד בעצמי על מנת שזה יעשה את העבודה, אין קיצורי דרך.

את החלק הקל של encoding & decoding פונט אנגלית כבר כתבתי ע"ב המידע שיש כאן -
https://en.wikipedia.org/wiki/Base64
וזה עובד טוב.

אבל לא הצלחתי להבין איך זה מתבצע בעברית, כמו שהאתר הזה מבצע , ומבצע היטב!
https://www.base64encode.org/
לדוגמא- אני יודע שהאות "א" מיוצגת כ "15A" , ושהאות "ב" מיוצגת כ "15E"


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

תודה,
מוטי.

zivo
15-02-19, 00:32
ממש לא ברור מה אתה שואל -
1- באיזה סביבה אתה כן רוצה לעבוד (הבנתי לא ג'אווה או NET)?
2 - BASE64 זו שיטת המרה \ יצוג של בינארי ע"י אותיות ASCII (ראה פה - https://en.wikipedia.org/wiki/Base64), מה קשור עברית?

תסביר, ננסה לעזור

מוטי ג.
15-02-19, 00:39
זה מצחיק שאתה מחזיר לי את הלינק ששמתי בעצמי.

מה זה משנה באיזו סביבה אני עובד?
אפשר לקרוא לזה TwinCAT \ CODESYS או IEC61131-3 .
שום DLL או משהו קיים בעולם התוכנה ה"סטנדרטי" לא ניתן לייבא לשם. קח את זה כאקסיומה.

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

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

מוטי ג.
15-02-19, 00:58
נראה שה 16 לא רלוונטי.
עוד הבנתי מה הפער בין הערך המתקבל לתו לבין ערכו ה ASCII האמיתי.
לדוגמא "א" זה 144 במקום 224.
"ב" זה 145 במקום 225 .
אבל הבנתי שהאות האחרונה לא מתנהגת כמו כל השאר....
אאמת את זה מחר בלילה.

zerez
15-02-19, 06:11
אם אתה כותב את שני הצדדים (אנקודר ודקודר) ומשתמש רק בעברית אז יש לי פתרון פשוט.
תמיר את האותיות העבריות לאנגלית (א ל a, ב ל b) תמיר את זה עם הפונקציה שיש לך ובצד השני תעשה את הפעולה ההפוכה.
אם יש לך גם אנגלית אז אפשר להשתמש ב esc sequence



Sent from my Redmi Note 5 using Tapatalk

מוטי ג.
15-02-19, 06:19
אבל אני לא שולט בשני הצדדים!
אני צריך מהצד שלי לשלוח מקודד כך שהצד השני יקבל את ב base64
ולהבין מה נשלח אליי ולכן צריך מפענח.

הבנתי כבר שזה לא ערכי ascii אלא utf8.
ואחרי פירוק נכון לקבוצות של 6 ביטים גם הקידומת של ה215 מופיע לפני כל אות:
https://www.utf8-chartable.de/unicode-utf8-table.pl?start=1408&number=128&names=-&utf8=dec

אבל לא נפל לי האסימון למה התו האחרון מגיע בפורמט אחר. אולי יש לו תוספת קבועה, אבל לא חקרתי לגמרי עד הסוף.


Sent from my LG-H930 using Tapatalk

erezgur
15-02-19, 07:51
מוטי,
"עברית" זה לא חד משמעי, קיימים קידודים שונים, כלומר האות א', למשל, יכולה להיות מיוצגת בצורות שונות בהתאם לקידוד בו נעשה שימוש.
הקידודים המקובלים הינם utf-8 (שהוא unucide ש-8 הבריטים הראשונים שלו זהים לקידוד ascii) או windows-1255 המקובלת בעיקר על מחשבי חלונות.
אבל יש עוד מספר סוגי קידוד שונים לעברית, החל מדפי-קוד מעולם ה-dos וכלה בקידוד unicode רחב (wide characters) שבו כל אות שאינה ascii פשוט (כלומר לא אנגלית וסימנים פשוטים) יכולה לתפוש מספר בתים משתנה.
לכן אתה צריך להחליט /לדעת מהו הקידוד של העברית הרלוטנטי לבעיה שלך.
לאחר שאתה יודע מהי הקידוד - תוכל לדעת מהו הייצוג הנכון של כל תו בעברית (כלומר כיצד כל אות בעברית מתורגמת לבתים) ומשם הדרך ל- base64 קלה יחסית.


...נכתב מהנייד, סליחה על השגיאות

מוטי ג.
15-02-19, 08:27
1. זו בדיוק הבעיה..... אני לא יודע כיצד זה מקודד ולכן אני לא יכול לקודד את זה בעצמי או לפענח את זה.
2. לפי הממצאים האחרונים שלי, האות א מגיעה כפורמט של צמד הספרות 215& 144 אני מבין עכשיו שזה UTF8,
ה 215 מציין איזה "מרווח" שפות שאינו אנגלית טהורה , וה144 זה א.
אבל יש לי בעיה כרגע להבין למה זה לא עקבי לאורך כל הטקסט ומשתנה באות (או אותיות) האחרונות.

לדוגמא, "א" = 215,144
"ב"= 215,145

הטקסט "אב" הוא הסדרה הבאה 215,144,215,145 = עד כאן סבבה.
הטקסט "אבא" הוא הסדרה הבאה 215,144,215,145,215,144 = עד כאן סבבה ++
אבל....
"אבג" זו הסדרה הבאה:
215,144,215,145,215,172

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

מוטי ג.
15-02-19, 08:55
מצאתי באג בקוד שלי, הבאג הרס לי את הסיומת לכן לא הייתה לי חזרתיות.
נראה שיש פתרון

erezgur
15-02-19, 22:07
אני מחוץ לבית עד יום שני.
ביום שני אוכל לנסות לסייע


...נכתב מהנייד, סליחה על השגיאות

מוטי ג.
15-02-19, 23:10
פענוח עובד לי, אנגלית ועברית, כולל מעורב אנגלית עם עברית.
עכשיו אני עובד על הקידוד, סתם משהו טכני מעצבן.... אבל לא עובד לי עם עברית.
הלילה עוד ארוך....

Sent from my LG-H930 using Tapatalk

מוטי ג.
15-02-19, 23:23
הקטע שכמו שאמרתי יש לי פונקציה לקידוד ופענוח עבור אנגלית בלבד.
ויש לי 2 אופציות, להוסיף שם את התוספת עבור עברית, או לכתוב הכל מההתחלה.

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

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

כל זה אחרי המקלחת....

Sent from my LG-H930 using Tapatalk

assafy
16-02-19, 19:26
נראה לי שיש כאן קצת בלבול במושגים. Base64 זו שיטה כללית לייצג מידע בינארי בprintable characters. יש פורמטים כגון mime במייל שהם טקסטואלים ודורשים את זה. כל 6 ביט הופכים ל8 כך שיש ניפוח של 33 אחוז בהגדרה.
הנושא של יוניקוד וcharacter encoding זה נושא רחב. ישנם קידודים שונים של יוניקוד כגון utf8 וutf16. להוסיף לחגיגה אפשר לייצג utf16 כ big endien או little endien.

מוטי ג.
16-02-19, 19:46
מבחינתי אין שום בלבול במושגים....
היה חוסר ידע באופן "קידוד"הטקסט ו"פענוח"

Sent from my LG-H930 using Tapatalk

mugi8675
16-02-19, 21:45
בהנחה שאין שגרה שאפשר להוריד מהיכן שהוא, הגדר שני מערכים באורך 256 כ״א. אלו טבלאות התרגום שלך. הראשון מכיל את התרגום מהמקור ליעד התרגום והשני את ההפיך. בכל כניסה (Offset) הכנס את הערך התאים. לדוגמא, אם א׳ זה '23'x איזי במקום ה- 35 הכנס את הייצוג של א בפורמט החדש. כל שנותר הוא לפרק את המחרוזת לאותיות (כלומר לעשות parsing) ולחפש כל תו מהמקור בטבלת היעד שלו. בשפות שונות יש פקודות מתאימות לביצוע. ב- Assembler של מחשב מרכזי זה פקודה אחת (TR)... בקיצור בשפה שאתה כותב תיישם את הלוגיקה. אגב, באיזה שפ אתה כותב את התכנית?

מוטי ג.
16-02-19, 22:34
חבל שאתם לא קוראים מה שאני כותב, וטורח לעדכן....

סיכום אחרון:
1. סביבת העבודה היא סביבת בקר מתוכנת PLC שרץ על גבי מערכת WINDOWS , היא נקראת TwinCAT מבוססת שפה שנקראת CODESYS(כנ"ל תוכנה לבקרים) שמכילה גם שפת פיתוח דומה לפסקל, אבל שום כלי פסקלי לא יכול לרוץ שם , ולא נראה לי שיש במרחב האינטרנט מידע על פסקל כי הוא מעידן טרום האינטרנט (בכל מקרה, לא חיפשתי)
-->כמו שאמרתי, לא מוכרת בעולם התוכנה, למעט מי שמתעסק בבקרים (במקרה אני מתפרנס מזה)
2. יש כלי מוכן (=פונקציה\מתודה)שיודע לטפל באנגלית בלבד, אבל זה לא עוזר לי לספק פתרון שכולל גם עברית.
3. מהלינק ששמתי בהודעה הראשונה לויקיפדיה, הבנתי בכל הטריק הוא ייצוג של תו ע"י 6 ביטים (ולכן זה נקרא BASE64 = 2^6) ולא 8 ביטים, לכן היה נדרש לקחת את כל המחרוזת שמגיעה, לייצר בה חלוקה מחדש של 6ביטים ובעצם לקבל ייצוג מספרי אחר מה ASCII עבור כל אות.
עוד הבנתי מויקיפדיה מה הערך של אות אנגלית בייצוג 6 ביטים הזה, אבל לא כתוב שם ולא מצאתי איך מיוצגת שם עברית.
4. מאתר אחר ברשת, הבנתי מה מגיע בצד השני כששולחים עברית, אבל לא כיצד זה מתבצע, ולכן פתחתי פה את השרשור.

5. לאחר הרבה זמן של משחקים הבנתי הייצוג של עברית הוא בשני סטים של 6 ביטים, כשהראשון הוא 215 והשני הוא ערכו של התו בUTF8 (שמבחינתי זה אופסט של 80 מערכו ב ASCII , כי המרות לASCII וחזרה יש לי בבקר)

6. בטקסט מעורבב של אנגלית ועברית, ערך מספרי קטן מ 64 מציין שזו אות אנגלית ולכן התו הנכון נמצא בטבלת ההמרה של BASE64 , ואם הערך הוא 215 , אז צריך לקחת את התו הבא מתוך טבלת המרה של UTF8 או להוסיף לו 80 ולקחת מ ASCII (שזה מה שאני עשיתי)

כל זה עבור DECODER, כלומר לקבל טקסט בבסיס 64 ולהמירו לטקסט בסיס 256 "רגיל".

**עבור ENCODER , העסק עובד פשוט הפוך , צריך לבצע את צעד 6 לפני צעד 5.

תודה, אצלי זה עובד, ויש לי עוד לקוח מרוצה.:)

מוטי ג.
16-02-19, 22:41
תמונת מסך לכלי שמצאתי ברשת:
122943

וזה תמונת מסך לכלי שלי, twinCAT זה הצד של הבקר, ATVISE זה המוצר בצד השני
122942

zivo
16-02-19, 23:07
מוטי,

שאלה,
נגיד ואתה צריך לעשות את הפרוייקט הזה בארץ דוברת אנגלית (או בארץ ללא שימוש בעברית), אתה גם הייתה בוחר להשתמש ב BASE64?

מוטי ג.
16-02-19, 23:15
לא, לא הייתי נכנס לסיפור הזה בכלל!

הכל התחיל מבעית תצוגה של עברית במוצר HMI של חברת Atvise שלקוח שלי מאוד אוהב.
אבל הם לא מצליחים לייצב גרסה שתומכת בעברית באופן מלא.
כלומר, ניתן לערוך בתוכנה שלהם טקסט עברית, כמו לייבל וכו.
או רשימת טקסט (כמו מילון) לדוגמא עבור תקלה מספר 1 תציג טקסט כזה.
ועבור תקלה מספר 2 תציג טקסט אחר.
אבל לא לקבל טקסט תקלה מהבקר שלי כ string.
ולא. הבעיה לא בבקר שלי.

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



Sent from my LG-H930 using Tapatalk

zivo
16-02-19, 23:26
כלומר, הבעיה היא לא התצוגה אלא פרטוקול התיקשורת ואיך להעביר מחרוזת עברית?

מוטי ג.
16-02-19, 23:31
ממממ
כנראה שכן,
המוצר הזה בצד השני, האטוויס הזה, כנראה לא יודע לקבל ascii רגיל ולהבין שזה עברית. הוא מציג ג'יבריש במקום.
למרות שמוגדר שם ש unicode text & utf8.

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

אבל נראה שעם הטריק של בסיס 64 זה יעבוד

Sent from my LG-H930 using Tapatalk

alto
17-02-19, 08:23
ממממ
שאלתי, יש לכם עברית על המחשב? ענו לא.
אז איך בדקתם את זה, ענו שעם אנגלית אין בעיה.
Sent from my LG-H930 using Tapatalk
הפתרון במצבים כאלו זה להגיד שאתה צריך תמיכה בערבית / הודית / סינית. למרות החיבה שלנו לשפת האבות אין לה ביקוש רב בעולם, ברגע שמזכירים שווקים קצת יותר גדולים הגישה משתנה בד"כ.

מוטי ג.
17-02-19, 21:39
אני מכיר את הטריק עם ערבית, בכל זאת...הם צרכן גדול מאיתנו.
הפעם גם לא עבד,אבל נראה לי שפשוט נפלתי על הבן אדם הלא מתאים בצד השני.
לא נורא. יש פתרון עובד.

Sent from my LG-H930 using Tapatalk

-->