الفاصلة العليا المطبعية + سلسلة حرفية واسعة عطلت wofstream (C++)

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

سؤال

لقد واجهت للتو بعض السلوكيات الغريبة عند التعامل مع الفاصلة المطبعية المشؤومة ( ’ ) - وليس الفاصلة العليا المطبعية ( ' ).تستخدم مع سلسلة حرفية واسعة، الفاصلة العليا تكسر wofstream.

يعمل هذا الرمز

ofstream file("test.txt");
file << "A’B" ;
file.close();

==> أ ب

يعمل هذا الرمز

wofstream file("test.txt");
file << "A’B" ;
file.close();

==> أ ب

فشل هذا الرمز

wofstream file("test.txt");
file << L"A’B" ;
file.close();

==> أ

هذا الكود فاشل...

wstring test = L"A’B";
wofstream file("test.txt");
file << test ;
file.close();

==> أ

اي فكرة ؟

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

المحلول

يجب عليك "تمكين" اللغة قبل استخدام wofstream:

std::locale::global(std::locale()); // Enable locale support 
wofstream file("test.txt");
file << L"A’B";

لذلك إذا كان لديك لغة النظام en_US.UTF-8 ثم الملف test.txt ستشمل بيانات UTF8 المشفرة (4 وداع) ، إذا كان لديك لغة النظام en_US.ISO8859-1, ، فسيتم تشفيره على هيئة ترميز 8 بت (3 بايت)، ما لم يفقد ISO 8859-1 مثل هذا الحرف.

wofstream file("test.txt");
file << "A’B" ;
file.close();

يعمل هذا الرمز بسبب "A’B" هي في الواقع سلسلة UTF-8 ويمكنك حفظ سلسلة UTF-8 إلى ملف BYTE بواسطة BYTE.

ملحوظة: أفترض أنك تستخدم POSIX مثل نظام التشغيل، ولديك لغة افتراضية مختلفة عن "C" التي هي اللغة الافتراضية.

نصائح أخرى

هل أنت متأكد من انها ليست دعم المترجم الخاص بك للحروف يونيكود في ملفات مصدر هذا هو "كسر"؟ ما إذا كنت تستخدم \x أو ما شابه ذلك لترميز حرف في سلسلة حرفية؟ هو الملف المصدر حتى في أي ترميز القوة القوة لwchar_t لالمترجم الخاص بك؟

وحاول يلف شخصية الإدراج تيار في كتلة try-catch وتقول لنا ما، إن وجدت، باستثناء يلقي عليه.

وأنا لست متأكدا ما يجري هنا، ولكنني سوف مضايقة تخمين على أي حال. اقتباس أحادية المطبعية ربما لديه القيمة التي تنسجم بايت واحد. هذا يعمل مع "A’B" لأنها عمياء نسخ بايت دون أن يكلف نفسه عناء حول الترميز الأساسي. ومع ذلك، مع L"A’B"، تنفيذا يعتمد عامل الترميز يأتي دور. وربما لا يجد القيمة الصحيحة UTF-16 (إذا كنت على نظام التشغيل Windows) أو UTF-32 (إذا كنت على * نيكس / ماك) لتخزين لهذه الشخصية بشكل خاص.

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