الفاصلة العليا المطبعية + سلسلة حرفية واسعة عطلت wofstream (C++)
-
03-07-2019 - |
سؤال
لقد واجهت للتو بعض السلوكيات الغريبة عند التعامل مع الفاصلة المطبعية المشؤومة ( ’ ) - وليس الفاصلة العليا المطبعية ( ' ).تستخدم مع سلسلة حرفية واسعة، الفاصلة العليا تكسر 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 (إذا كنت على * نيكس / ماك) لتخزين لهذه الشخصية بشكل خاص.