الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

ال UNICODE

مغلق
بدأه mhammad في 20 يناير 2003 · 2 رد · 354 مشاهدة · في ارشيف قسم C/C++
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

كثيرا من بارامترات التوابع تحتاج الى قيم من النوع LPTSTR وLPWSTR و LPCTSTR أعرف أن هذه مؤشرات الى سلاسل نصية من النمط UNICODE ولكن المشكلة عدم قدرتي على تعريف هذا النوع جربت أن أعرف مؤشر من النمط char ليستخدم في تابع يطلب بارامتر من النوع LPTSTR

مثلا

#include "iostream.h"
#include "windows.h"

char* getname()
{
	char* pStr = new char[50];
	GetUserName(pStr,(LPDWORD)strlen(pStr));
	return pStr;
}

int main()
{
	cout<	return 0;
}

والنتيجة طباعة أحرف غير مفهومة

جربت ايضا استخدام wchar_t بدل char واضافة W الى الدالة كما يلي

#include "iostream.h"
#include "windows.h"

wchar_t* getname()
{
	wchar_t* pStr = new wchar_t[50];
	GetUserNameW(pStr,(LPDWORD)wcslen(pStr));
	return pStr;
}

int main()
{
	cout<	return 0;
}

والنتيجة طباعة عنوان ذاكرة

أرجوا توضيح الطريقة الصحيحة لتعريف هذه الأنواع

سؤال أخر

أكثر التوابع تكون بصيغتين صيغة تستخدم مع ال ANSI ويكون أخر التابع حرف A وصيغة تستخدم للUNICODE ويكون أخر التابع حرف W فلماذا لم يعمل التابع بشكل صحيح عند كتابته بالشكل GetUserNameA مع ان سلسلة الحروف من النوع ANSI ، أرجوا تصحيحي ان كنت مخطئ .

أرجوا توضيح ذلك أيضا

وشكرا (f)

#2

أخي سوف أشرح لك أكثر المرة الرد القادم عن ال unicode وكيفية استخدامها في فجوال سي++ ..

ولكن أولا كودك غلط لذلك ظهرت معك حالات غريبة .. وانتبه كيف تستدعي التوابع التي تطلب حجم الbuffer لأني شاهدات هذا الخطأ منك مرتين إلى الآن ..

الكود التالي يوضح حالتيك الاثنتين :

#include "windows.h"

#include <iostream>

#include <algorithm>

using namespace std;



wchar_t* getnameW()

{

	DWORD size = 50;

	wchar_t *str = new wchar_t[size];

	GetUserNameW(str, &size);

	return str;

}



char* getnameA()

{

	DWORD size = 50;

	char *str = new char[size];

	GetUserNameA(str, &size);

	return str;

}



int main()

{

	// Wide string

	//



	wchar_t *wstr = getnameW();



	printf("%Sn", wstr);  // Using printf



	// using copy function to cout

	copy(wstr, wstr + wcslen(wstr), ostream_iterator<char>(cout, ""));

	cout << endl;



	//  Byte string

	//



	char *str = getnameA();

	cout << str << endl;



	// Free 



	delete [] wstr;

	delete [] str;



	return 0;

}

أيضا يجب أن تعلم أن cout فقط تقبل طباعة السلاسل من نوع byte لذلك استخدمت ال copy في الطباعة وعند استخدام copy تمت عملية cast لكل wchar_t إلى char ..

استخدام printf فتقوم بتحويل ال unicode إلى multibytestring وطباعتها .. وتستخدم التابع wctomb للتحويل ..

Coding on the Cloud and for the Cloud!

My Blog

#3

ألف شكر أخ هاني

وان شاء الله ما بتكرر الغلط :o

هذا الموضوع مغلق.

مواضيع مشابهة