سؤال

الكود الخاص بي هو هذا في الأساس:

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 - هذا غير صحيح ، يتم مزامنتها افتراضيًا. لا حاجة.

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