Whatsup - לינוקס, תוכנה חופשית וקוד פתוח בעברית

תמיכת לינוקס כללית - עברית ב-C++

Anonymous - 18/10/2017 - 19:19
נושא ההודעה: עברית ב-C++
היכן ניתן למצוא חומר מסודר (או חומר בכלל) בנושא של עברית ב-C++ (הצגה, ייצוג, אכסון בזיכרון, וכדומה)?
elcuco - 18/10/2017 - 19:36
נושא ההודעה:
אחסון זאת לא בעייה זה שקוף.

תצוגה - תלוי ב-toolkit שלך, אבל בגדול מאוד, כולם מתמודדים עם זה. אתה זורק את העברית לפקד המתאים (textedit - inputline - label ומה שלא יהיה) וזה מוצג.

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

בקיצור - זה לא חלק מהשפה. אבל רב הזמן זה עובד שקוף.
מה אתה צריך לעשות בדיוק?
Anonymous - 19/10/2017 - 01:36
נושא ההודעה:
elcuco :
אחסון זאת לא בעייה זה שקוף.

תצוגה - תלוי ב-toolkit שלך, אבל בגדול מאוד, כולם מתמודדים עם זה. אתה זורק את העברית לפקד המתאים (textedit - inputline - label ומה שלא יהיה) וזה מוצג.

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

בקיצור - זה לא חלק מהשפה. אבל רב הזמן זה עובד שקוף.
מה אתה צריך לעשות בדיוק?


נתחיל ברמה הכי נאיבית, איך מתרגמים את ה-y שבקטע הקוד הזה לתו עברי?
קוד:

char x ='y'
cout << x

Anonymous - 19/10/2017 - 05:47
נושא ההודעה:
קוד:

char x ='ע'
cout << x

עברית זה unicode כמו בערך כל שפה אחרת היום
borsood - 19/10/2017 - 06:24
נושא ההודעה:
זה בטוח לא יעבוד. ++C עדיין לא מגדירה יוניקוד היטב.
האפשרויות הן:
קוד:
wchar_t x ='ע'
cout << x

או יותר טוב:
קוד:
std::string s =u8"ע"
cout << s

Anonymous - 20/10/2017 - 13:55
נושא ההודעה:
אחת ההרחבות ב boost, מאפשרת לך לכתוב את כל המחרוזות באנגלית, ולתרגם לעברית ולשפות אחרות בקובץ טקסט נפרד. בצורה כזאת אתה מתכנת רק מחרוזות באנגלית, ומפריד את העברית מהתכנה. אתה יכול לאפשר למתרגמים שהם לא מתכנתים להוסיף תרגום לתוכנה שלך בשפתם. זאת פרקטיקה נפוצה בקוד פתוח.
יש גם הרחבות נוספות שעושות את זה, אבל היתרון ב boost זה שהוא הכי בסיסי וסטנדרטי שאני מכיר, ולא תלוי במ"ה או שולחן עבודה.
http://www.boost.org/doc/libs/1_65_0/libs/locale/doc/html/messages_formatting.html
yyy - 16/04/2018 - 23:30
נושא ההודעה:
borsood :
זה בטוח לא יעבוד. ++C עדיין לא מגדירה יוניקוד היטב.
האפשרויות הן:
קוד:
wchar_t x ='ע'
cout << x

או יותר טוב:
קוד:
std::string s =u8"ע"
cout << s


אצלי זה:
קוד:
wchar_t x ='ע';
cout << x << endl;

לא עובד אלא רק מחזיר את המספר 55202 ובהידור כותב את האזהרה
קוד:
warning: multi-character character constant [-Wmultichar].


וזה
קוד:
std::string s=u8"ע";
cout << s;

מחזיר את שגיאות ההידור:
קוד:
error: ‘u8’ was not declared in this scope
 error: expected ‘,’ or ‘;’ before string constant

borsood - 17/04/2018 - 07:11
נושא ההודעה:
לחלק מהקומפילרים אתה צריך לומר שאתה רוצה לעבוד ב++c מודרני.
תוסיף
קוד:
--std=c++11

Anonymous - 17/04/2018 - 09:17
נושא ההודעה:
אתה מערבב בין תו קצר (single byte char) לבין תו ארוך wide char -
ב std::cout אתה משתמש לתוים קצרים ול multibyte (יוניקוד)
ב std::wcout אתה משתמש בשביל תווים ארוכים.

אתה יכול להמיר wchar_t ל multibyte עם wcstombs
Anonymous - 17/04/2018 - 14:53
נושא ההודעה:
זה:
קוד:
wchar_t x ='ע';
wcout << x << endl;

נותן אזהרה בהידור warning: multi-character character constant [-Wmultichar] וכשמריצים מדפיס
קוד:
 ?

גם נסיון להריץ את הלולאה הבאה:
קוד:

wchar_t x =150000;
for (;x>=0;x--)
    if (x=='ע')
       wcout << x << endl;

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


וזה:
קוד:
std::string s=u8"ע";
cout << s;

עובד רק עם cout, ולא עם wcout, רק שכאן נסיון להריץ לולאה שתציג את כל האותיות כמו בדוגמה למעלה נתקל בשגיאה. אני מניח שיש דרך אחרת לבצע זאת.
Anonymous - 17/04/2018 - 21:04
נושא ההודעה:
קוד:
#include <iostream>

int main()
{
   wchar_t w = L'ע';
   std::wcout << w << std::endl;
   return 0;
}

borsood - 18/04/2018 - 07:33
נושא ההודעה:
wchat_t לא נתמך היטב בלינוקס. בכל מקרה מהפכת האימוג'י מביאה לזה שגם בMS נוטשים את הקידוד הזה ועוברים לurf-8.

הקוד הבא יעבוד עם utf8 אבל לא בסביבות MS ו wchar_t ו wcout
קוד:
#include <iostream>
#include <string>

int main()
{
  std::string s = u8"🤦" ;
  std::cout << s << '\n';
  return 0;
}

התצוגה היא בהתאם לזמינות הגופנים בסביבת ההרצה.
בסופו של דבר ברור שהתמיכה ביוניקוד בשפה קצת לא טובה, יש קבוצת עבודה שעובדת על זה, מקווה שהדברים ישתפרו לקראת c++20
כל הזמנים הם GMT + 2 שעות