C ++: أحرف واسعة الإخراج بشكل غير صحيح؟
-
01-10-2019 - |
سؤال
الكود الخاص بي هو هذا في الأساس:
wstring japan = L"日本";
wstring message = L"Welcome! Japan is ";
message += japan;
wprintf(message.c_str());
أرغب في استخدام سلاسل واسعة لكنني لا أعرف كيف تم إخراجها ، لذلك استخدمت WPRINTF. عندما أقوم بتشغيل شيء مثل:
./widestr | hexdump
تخلق نقاط الترميز السداسية هذا:
65 57 63 6c 6d 6f 21 65 4a 20 70 61 6e 61 69 20 20 73 3f 3f
e W c l m o ! e J p a n a i s ? ?
لماذا قفزوا جميعًا بالترتيب؟ أعني إذا كان WPRINTF خاطئًا ، ما زلت لا أحصل على سبب إخراجها بترتيب مختلط محدد!
تحرير: endianness أو شيء من هذا القبيل؟ يبدو أنها تدور كل شخصين. هاه.
تحرير 2: حاولت استخدام WCOUT ، لكنه يخرج نفس نقاط الترميز السداسية. عجيب!
المحلول
تحتاج إلى تحديد اللغة
#include <stdio.h>
#include <string>
#include <locale>
#include <iostream>
using namespace std;
int main()
{
std::locale::global(std::locale(""));
wstring japan = L"日本";
wstring message = L"Welcome! Japan is ";
message += japan;
wprintf(message.c_str());
wcout << message << endl;
}
يعمل كما هو متوقع (أي تحويل سلسلة واسعة إلى ضيق UTF-8 وطباعته).
عندما تحدد اللغة العالمية إلى "" - تقوم بتعيين لغة النظام (وإذا كان UTF -8 ، فسيتم طباعتها على أنها UTF -8 - سيتم تحويل IE WSTRING)
يحرر: ننسى ما قلته حول sync_with_stdio - هذا غير صحيح ، يتم مزامنتها افتراضيًا. لا حاجة.