2009-06-18 14 views
29

Sto provando a convertire un C++ std::string in UTF-8 o std::wstring senza perdere informazioni (si consideri una stringa che contiene caratteri non ASCII).Quale codifica usa std :: string.c_str()?

Secondo http://forums.sun.com/thread.jspa?threadID=486770&forumID=31:

Se la std :: stringa ha caratteri non-ASCII, è necessario fornire una funzione che converte dalla codifica UTF-8 [...]

Quale codifica utilizza std::string.c_str()? Come posso convertirlo in UTF-8 o std::wstring in modo multipiattaforma?

risposta

35

std::string di per sé non utilizza la codifica - restituirà i byte inseriti. Ad esempio, quei byte potrebbero usare la codifica ISO-8859-1 ... o qualsiasi altra cosa, in realtà: le informazioni sulla codifica non sono proprio lì - devi sapere da dove provenivano i byte!

+0

Quindi in sostanza non c'è modo per me di convertire std :: string senza conoscerne la codifica prima del tempo? Chiedo perché sto scrivendo una funzione API che contiene una stringa std ::. Immagino che la documentazione dovrà istruire gli utenti su quale formato passare. – Gili

+3

@Gili, a destra: non è possibile convertire in modo affidabile una sequenza di byte in una codifica sconosciuta in UTF-8 (o qualsiasi altra cosa ;-). Vi consiglio di chiedere al chiamante di fornire i dati UTF-8 - la maggior parte delle altre codifiche non consente la codifica _every_ possibile stringa Unicode. Come dice @Naaff, ASCII è un caso speciale di UTF-8 (e ISO-8859- * e molte altre codifiche), quindi se questo è il tuo caso non c'è da preoccuparsi (una nota nei documenti che ricorda agli utenti di questo fatto potrebbe salvare _them_ preoccupazione;-). –

+0

Buona risposta, grazie :) – Gili

7

std::string contiene qualsiasi sequenza di byte, quindi la codifica dipende da voi. Devi sapere come è codificato. Tuttavia, se non sai che è qualcos'altro, probabilmente è solo ASCII. In tal caso, è già compatibile con UTF-8.

+12

Ho visto "probabilmente è solo ... "essere la fonte di tanti errori di codifica dei caratteri. Non suggerisco mai di indovinare quando si tratta di codifiche di carattere: essere sempre molto esplicito in ciò che si prende e ciò che si produce. In ogni caso, se non si specifica il set di caratteri, specificare un parametro aggiuntivo/valore di ritorno per indicare la codifica. – MtnViewMark

Problemi correlati