Quando si usa printf per formattare una stringa di byte doppio in una stringa singolo byte:Perché i parametri Unicode del formato printf non vengono stampati?
printf("%ls\n", L"s:\\яшертыHello"); // %ls for a wide string (%s varies meaning depending on the project's unicode settings).
Chiaramente, alcuni caratteri non possono essere rappresentati come caratteri ASCII, comportamento in modo a volte ho visto dove i caratteri a doppio byte diventare un '?' contrassegna il carattere. Ma questo sembra dipendere dai personaggi particolari. Per la printf sopra, l'output è:
s:\
Speravo che potrei ottenere qualcosa di simile:
s:\??????Hello
Temo di aver perso l'esempio, ma credo che per una stringa quando ha incontrato caratteri unicode, sostituito il primo con un '?' e poi ha rinunciato al resto.
Quindi, la mia domanda è, cosa dovrebbe succedere quando si formatta una stringa larga in una stringa a singolo byte. Documentazione qui: http://msdn.microsoft.com/en-us/library/hf4y5e3w.aspx dice "I caratteri sono visualizzati fino al primo carattere null". Ma non lo vedo. È un bug in printf, o è il comportamento che sto vedendo documentato da qualche parte, se è così, dove.
Grazie per il vostro aiuto.
UPDATE
Grazie per le risposte da persone che danno a me alternative all'utilizzo printf. Cambierò in un'alternativa, ma sono davvero interessato alla curiosità perché la stampa non ha un comportamento documentato affidabile. Sembra quasi che se l'implementatore abbia fatto di tutto per farlo funzionare.
Hai provato "% S" come identificatore di formato anziché "% ls"? –
si. Credo che% S e% ls abbiano lo stesso significato se il tuo progetto non ha UNICODE definito. –
Leggere le specifiche del formato (che sono d'accordo non sono chiare). S è per una stringa larga quando le impostazioni del progetto non hanno UNICODE definito, S è per una stringa a singolo byte quando si ha UNICODE definito. % ls è per una stringa ampia indipendentemente dal fatto che tu stia o meno per UNICODE o meno. % s varia anche il significato,% hs è sempre per stringhe a singolo byte. –