ما نوع السلاسل التي تتوقع cfstringcreatewithformat حسب الحجج؟

StackOverflow https://stackoverflow.com/questions/2027843

سؤال

يجب أن يعمل المثال أدناه مع سلاسل يونيكود ولكنه لا.


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 اليابانية / الكورية بسبب هذا "ترميز النظام" فقط يرجى الرجوع إلى هذا الشرح التفصيلي الذي كتبته قبل بضع سنوات، إذا كنت مهتما.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top