ما نوع السلاسل التي تتوقع cfstringcreatewithformat حسب الحجج؟
سؤال
يجب أن يعمل المثال أدناه مع سلاسل يونيكود ولكنه لا.
CFStringRef aString = CFSTR("one"); // in real life this is an Unicode string
CFStringRef formatString = CFSTR("This is %s example"); // also tried %S but without success
CFStringRef resultString = CFStringCreateWithFormat(NULL, NULL, formatString, aString);
// Here I should have a valid sentence in resultString but the current result is like aString would contain garbage.
المحلول
يستخدم %@
إذا كنت تريد تضمين CFStringRef
عبر CFStringCreateWithFormat
.
يرى قسم Spont Specifiers من دليل برمجة الدليل للمؤسسة الأساسية.
%@
هو للكائنات C الهدف، أوCFTypeRef
أشياء (CFStringRef
متوافق معCFTypeRef
)%s
هو لمجموعة ذات شهرين من الأحرف غير الموقعة 8 بت (أي سلاسل C طبيعية).%S
مخصص للحصول على صفيف بحنان من أحلام Unicode 16 بت.
كائن CFstringref ليس هو نفسه "صفيف تم إنهاء Null من أحرف Unicode ذات 16 بت".
نصائح أخرى
كإجابة على التعليق في الإجابة الأخرى، أود أن أوصي الملصق
- توليد سلسلة UTF8 بطريقة محمولة في
char*
- وفي اللحظة الأخيرة، تحويله إلى
CFString
استخدامCFStringCreateWithCString
معkCFStringEncodingUTF8
كما الترميز.
من فضلك، من فضلك لا تستخدم %s
في CFStringCreateWithFormat
. وبعد من فضلك لا تعتمد على "ترميز النظام"، والذي هو ماكرومان على البيئات الأوروبية الغربية، ولكن ليس في لغات أخرى. يعد مفهوم ترميز النظام بطبيعته ميتا في المخ، خاصة في بيئات شرق آسيا (التي أتيت منها) حيث تم تعديل حتى الشخصيات داخل نطاق رمز ASCII (أقل من 127!). الجحيم فواصل فضفاضة إذا اعتمدت على "ترميز النظام". لحسن الحظ، منذ 10.4، يتم الآن إهمال جميع الأساليب التي تستخدم "ترميز النظام"، إلا %s
... .
أنا آسف لأكتب هذا كثيرا لهذا الموضوع الصغير، لكنه كان من المؤسف الحقيقي قبل بضع سنوات عندما كانت هناك العديد من التطبيقات الجميلة التي لم تعمل على أجهزة MAC اليابانية / الكورية بسبب هذا "ترميز النظام" فقط يرجى الرجوع إلى هذا الشرح التفصيلي الذي كتبته قبل بضع سنوات، إذا كنت مهتما.