שאלות

eyal the one

New member
שאלות

CString פועל באופן שונה עבור הגדרות פרויקט של UNICODE ושל ANSI רגיל. עבור UNICODE הפונקציה GetBuffer נותנת מחזרוזת עם byte כפול. הבעיה היא שאני רוצה לשלוח מחרוזות של ansi כי אני עובד עם TCP/IP. ועדיין רוצה לעבוד עם מיטוב של UNICODE. קיצר איך אני מעביר את התוכן של CString ל מחרוזת char[] רגילה? ועוד משהו: אם אני עובד עם UNICODE האם הדבר הבא יעבוד?
CString x = "eyal";​
 

vinney

Well-known member
MBC

Multibyte character בלעז, זהו מנגנון שעובד כש_UNICODE לא מוגדר. יש פונקציות המרה מUNICODE לMBC וחזרה בספריה הסטנדרתית, למשל wcstombs.
 

eyal the one

New member
לא הבנתי כלום

אני מדבר תכלס:
// the application is defined for unicode CString x("eyal"); char sArray[256]; strcpy(sArray,x);​
תווצר כאן בעיה כיוון ש CString מוגדר ל UNICODE. איך לכתוב את ה קוד כך שהעסק יעבוד. (אגב ב ANSI זה היה עובד כי ל CString יש העמסה ל LPCTSTR. ולכן הוא היה יודע להחזיר מצביע למחרוזת קבועה)
 

vinney

Well-known member
למה זה לא יעבוד?

רק שאם יש לך UNICODE אתה צריך להשתמש ב wcscpy.
 

eyal the one

New member
לא הבנת

אני לא רוצה לשים את זה במחרוזת של בייט כפול, זה בדיוק הקטע, אני רוצה להפוך את זה למחרוזת של ansi,כי אני רוצה ליצור string מצומצם להעברה ב networking נניח. הבעיה היא שהאוביקט CString מכיל byte כפול. איך אני הופך את זה ל byte יחיד בקליטה אל char[]. האם ב mfc יש משהו מובנה כבר בשביל לסדר את זה?
 

vinney

Well-known member
נפל האסימון ../images/Emo13.gif אתה לא יכול.

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

gilad_no

New member
אתה טועה

ניתן בהחלט להפוך מאנסי ליוניקוד ולהיפך. בATL יש את המקרואים המצוינים A2W, W2A וכו' אשר עוטפים את MultiByteToWideChar ודומיה.
 

vinney

Well-known member
אוקי, זה נכון, אבל לא בדיוק...

מה שהוא רצה. הנה תיאור מMSDN לבעייתיות שבעניין: By default, the ATL conversion classes and macros will use the current thread's ANSI code page for the conversion. If you want to override that behavior for a specific conversion using macros based on the classes CA2WEX or CW2AEX, specify the code page as the second parameter to the constructor for the class. אתה ממיר תוי UNICODE לתוי ASCII => אתה בהכרח מאבד מידע. תו UNICODE מומר לתו ASCII בהתאם להגדרות, ואותו תו UNICODE יכול למצוא את עצמו מומר לתו ASCII שונה מפעם לפעם אם משתמשים בטבלאות המרה שונות (למשל - מחשב אחד עובד עם מערכת הפעלה בעברית, והאחר - בסינית מדוברת). מכיוון שהוא מעביר את המידע ברשת, ואין לו (לפי מה שהבנתי) דרך לדעת מה ההגדרות בצד השני, זה לא פתרון טוב. רצ"ב הפסוק מהתנ"ך.
 

eyal the one

New member
ועוד שאלה

בהגדרות הפרויקט שלי יש רק שתי שורות אפשריות: win32 release win32 debug למה אין לי גם את ה unicode?? איך אני מקמפל להגדרות של unicode? אגב, לא יודע אם זה קשור, אבל הוספתי את ה sdk כמו שצריך, וכל ה libraries מצביעים קודם לספריות האלה בצורה נכונה.
 

eyal the one

New member
רגע , שאני אבין

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

vinney

Well-known member
בהגדרות של הפרוייקט

בחוצץ ++C/C יש שדה preprocessor definitions. זה יתפוס לכל קובץ בפרוייקט.
 
למעלה