الأحرف القراءة خارج ASCII
سؤال
وهناك صديق لي وأظهر لي الوضع حيث أنتجت الأحرف قراءة سلوك غير متوقع. قراءة الحرف '¤' بسبب برنامجه لتحطم الطائرة. وكنت قادرا على استنتاج أن '¤' هو 164 عشري لذلك من خلال مجموعة ASCII.
لاحظنا سلوك على '¤' ولكن أي حرف> 127 يبدو لإظهار المشكلة. والسؤال هو كيف يمكننا أن قراءة موثوق مثل هذه الشخصيات شار التي كتبها شار؟
int main(int argc, const char *argv[])
{
char input;
do
{
cin >> input;
cout << input;
cout << " " << setbase(10) << (int)input;
cout << " 0x" << setbase(16) << (int)input;
cout << endl;
} while(input);
return 0;
}
masse@libre:temp/2009-11-30 $ ./a.out
¤
 -62 0xffffffc2
¤ -92 0xffffffa4
المحلول
والنظام الخاص بك يستخدم ترميز الأحرف UTF-8 (كما يجب) وذلك الحرف '¤' يتسبب البرنامج لقراءة تسلسل بايت C2 A4
. منذ char
هو بايت واحد، فإنه يقرأ واحد في وقت واحد. النظر في wchar_t
والمقابلة wcin
وwcout
تيارات لقراءة الأحرف متعددة البايت، على الرغم من أنني لا أعرف أي ترميزات التي تدعمها أو كيف تلعب مع لغات.
وبالإضافة إلى ذلك، البرنامج يتم إخراج UTF-8 صالح، لذلك كنت حقا لا ينبغي أن تكون رؤية تلك الشخصيتين - أحصل على علامات استفهام على نظام بلدي
(وهذا هو تصيد الأخطاء وofftopic إلى حد ما، ولكن ينبغي while(input)
while(cin)
، وإلا ستحصل حلقة لا نهائية.)
نصائح أخرى
ومن الصعب أن نقول لماذا برنامج صديقك وتحطمها دون رؤية رمز، ولكنها قد تكون لأنك تستخدم شار وذلك في مؤشر إلى صفيف. منذ أحرف خارج نطاق ASCII العادي وتجاوز حدود شار وقعت، وشار في نهاية المطاف سلبية.
وأعلن "الإدخال" كما شار غير موقعة بدلا