سؤال

أنا بناء حزم البيانات ليتم إرسالها على NSStream إلى ملقم.أنا أحاول أن منفصل قطعتين من البيانات مع '§' (ascii code 167).هذه هي الطريقة خادم بنيت لذا تحتاج إلى محاولة البقاء ضمن تلك الحدود...

unichar asciiChar = 167;  //yields @"§"
[self setSepString:[NSString stringWithCharacters:&asciiChar length:1]]; 

sendData=[NSString stringWithFormat:@"USER User%@Pass", sepString];

NSLog(sendData);

const uint8_t *rawString=(const uint8_t *)[sendData UTF8String];

[oStream write:rawString maxLength:[sendData length]];  

وبالتالي فإن النتيجة النهائية يجب أن تبدو مثل هذا..وأنه لا عندما sendData هي الأولى التي شيدت:

USER User§Pass 

ومع ذلك ، عندما يتم تلقي على جانب الملقم ، يبدو مثل هذا:

//not a direct copy and paste. The 'mystery character' may not be exact
USER UserˤPas

...في المفرق السلسلة أصبحت اثنين في طول الحرف الأخير هو الحصول على اقتصاص من الأمر.وأعتقد أن هذا سبب من UTF8 التحويل.

يمكن لأي شخص أن يلقي بعض الضوء على هذا بالنسبة لي ؟

أي مساعدة ستكون موضع تقدير كبير!

هل كانت مفيدة؟

المحلول

الصحيح في ترميز UTF-8 عن هذا الحرف هو تسلسل بايت 0xC2 0xA7 ، وهو ما كنت تحصل.(Fileformat.info لا تقدر بثمن من أجل هذه الأشياء.) هذا هو من اللاتينية-مجموعة 1 ، لذلك كنت بالتأكيد تريد أن تكون باستخدام NSISOLatin1StringEncoding بدلا من NSUTF8StringEncoding من أجل الحصول على بايت واحد 167 الترميز.انظر NSString -dataUsingEncoding:.

نصائح أخرى

ماذا لديك وماذا تريد أن أحيل ليس حقا UTF-8 سلسلة ، وأنه من الناحية الفنية لا us-ascii, لأن هذا هو فقط 7 بت.تريد نقل تعسفية مجموعة من بايت ، وفقا للبروتوكول الذي كنت تعمل مع.اثنين من المجالات صفيف بايت, اسم المستخدم وكلمة المرور قد تكون نفسها UTF-8 سلاسل, ولكن مع 167 فاصل فإنه لا يمكن أن يكون UTF-8 سلسلة.

وهنا بعض الخيارات أرى:

  • بناء uint8_t* صفيف بايت باستخدام اثنين على الأقل مختلفة NSString الأجسام بالإضافة إلى 167 التعليمات البرمجية.هذا وسوف يكون من الضروري إذا كان اسم المستخدم أو كلمة المرور يمكن أن تحتوي على أحرف غير ascii.
  • استخدام NSString طريقة getBytes:maxLength:usedLength:encoding:options:range:remainingRange وتعيين encoding إلى NSASCIIStringEncoding.إذا كنت تفعل هذا يجب التحقق من صحة في مكان آخر أن اسم المستخدم الخاص بك وكلمة المرور us-ascii فقط.
  • استخدام NSString طريقة getCString.بيد أن تم إيقافها لأنه لا يمكن تحديد الترميز الذي تريد.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top