Una risposta molto parziale per la prima domanda: Un file è una sequenza di byte modo, quando si tratta di wchar_t
's, almeno alcuni conversione tra wchar_t
e char
deve avvenire. Rendere questa conversione "intelligente" richiede la conoscenza delle codifiche dei caratteri, quindi questo è il motivo per cui questa conversione può essere dipendente dalla locale, in virtù dell'uso di un facet nelle impostazioni locali del flusso.
Quindi, la domanda è come tale conversione dovrebbe essere effettuata nell'unica locale richiesta dallo standard: quella "classica". Non c'è una risposta "giusta" per questo, e lo standard è quindi molto vago a riguardo. Capisco dalla tua domanda che pensi che gettare ciecamente (o memcpy() - ing) tra wchar_t [] e char [] sarebbe stato un buon modo. Questo non è irragionevole, ed è in effetti ciò che è (o almeno è stato) fatto in alcune implementazioni.
Un altro POV sarebbe che, dal momento che un codice è un aspetto locale, è ragionevole aspettarsi che la conversione venga effettuata utilizzando la "codifica del locale" (qui ho la mano libera, poiché il concetto è piuttosto sfocato). Ad esempio, ci si aspetterebbe che un locale turco utilizzi ISO-8859-9 o un giapponese per usare Shift JIS. Per somiglianza, il locale "classico" si converte in questa "codifica del locale". Apparentemente, Microsoft ha preferito semplicemente tagliare (che porta a IS-8859-1 se supponiamo che wchar_t
rappresenti UTF-16 e che rimaniamo nel piano multilingue di base), mentre l'implementazione Linux che conosco ha deciso di passare all'ASCII.
riguarda la seconda domanda:
Inoltre, siamo andando ottenere flussi reale Unicode con C++ 0x o mi manca qualcosa qui?
Nella sezione [locale.codecvt] del n2857 (l'ultima bozza C++ 0x ho a portata di mano), si legge:
La specializzazione codecvt<char16_t, char, mbstate_t>
converte tra l'UTF-16 e Schemi di codifica UTF-8 e la specializzazione codecvt <char32_t, char, mbstate_t>
converte tra gli schemi di codifica UTF-32 e UTF-8. codecvt<wchar_t,char,mbstate_t>
converte tra i set di caratteri nativi per caratteri stretti e larghi.
Nel [locale.stdcvt] sezione, troviamo:
Per la sfaccettatura codecvt_utf8
: - L'aspetto è la conversione tra UTF-8 sequenze multibyte e UCS2 o UCS4 (a seconda delle dimensioni delle Elem) all'interno del programma. [...]
Per la sfaccettatura codecvt_utf16
: - L'aspetto è la conversione tra UTF-16 sequenze multibyte e UCS2 o UCS4 (a seconda delle dimensioni delle Elem) all'interno del programma. [...]
Per la sfaccettatura codecvt_utf8_utf16
: - L'aspetto è la conversione tra UTF-8 sequenze multibyte e UTF-16 (uno o due codici a 16 bit) all'interno del programma.
Quindi immagino che questo significhi "sì", ma per essere sicuri, dovresti essere più preciso su cosa intendi per "flussi di unicode reali".
Buona domanda. Spero che tu possa trovare una risposta. Personalmente mi sto appoggiando alla teoria "IOStreams è solo una biblioteca mal progettata";) Probabilmente non aiuta che Unicode non fosse esattamente ben stabilito quando la libreria è stata progettata. Potrebbero aver pensato che la serializzazione da/verso caratteri semplici fosse l'approccio più portabile. – jalf
@jalf Grazie. Non sono molto abile con i flussi ma questa domanda mi infastidisce molto: D – AraK