2013-11-14 5 views
7

ho un problema, ho bisogno di utilizzare stringhe UTF-8 codificati sui tipi char standard, in codice sorgente C++ in questo modo:Esiste un modo semplice per scrivere gli ottetti UTF-8 in Visual Studio?

char* twochars = "\xe6\x97\xa5\xd1\x88"; 

Normalmente, se voglio scrivere un carattere UTF-8 ho bisogno di usare ottetti come sopra. C'è qualcosa in Visual Studio (sto usando VS 2013 Ultimate) che potrebbe permettermi di scrivere solo per esempio "ĄĘĆŻ" e convertire automagicamente ogni personaggio in più ottetti UTF-8 come nell'esempio sopra? O dovrei usare const wchar_t* e trovare una lib che possa convertire stringhe larghe in stringhe di caratteri standard codificati in UTF-8?

Se non esiste una cosa del genere, potresti suggerire un software esterno? Non ho davvero voglia di sfogliare la mappa dei personaggi per ogni simbolo/lettera non latina.

Ci scusiamo per il mio inglese, Grazie in anticipo.

+4

'#pragma execution_character_set ("utf-8")' usato per lavorare in VC++ 2010, non so se è ancora disponibile in VC++ 2013. – Jigsore

+0

E funziona! Perché non lo pubblichi come risposta, quindi posso accettarlo? –

risposta

16

È possibile utilizzare la direttiva undocumented pragma execution_character_set("utf-8"). In questo modo le tue stringhe char verranno salvate come UTF-8 nel tuo file binario. A proposito, questo pragma è disponibile solo nei compilatori di Visual C++.

#include <iostream> 
#include <cstring> 

#pragma execution_character_set("utf-8") 

using namespace std; 

char *five_chars = "ĄĘĆŻ!"; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    cout << "This is an UTF-8 string: " << five_chars << endl; 
    cout << "...it's 5 characters long" << endl; 
    cout << "...but it's " << strlen(five_chars) << " bytes long" << endl; 
    return 0; 
} 
+1

fantastico! questo era il suggerimento che stavo cercando per minuti. – fmuecke

+0

Grazie mille! –

+0

Non riconosciuto in VS2102. Il pragma è stato supportato in VC++ 2010, quindi dimenticato in VC++ 2012 ed è nuovamente supportato in VC++ 2013 [collegamento] (http://stackoverflow.com/questions/23607830/does-vc-have-a-compile-option-like -fexec-charset-in-gcc-to-set-the-execution) – TinyRacoon

2

Non c'è modo di scrivere la stringa letterale direttamente in UTF-8 con le versioni correnti di VC++. Una versione futura dovrebbe avere UTF-8 string literals.

Ho provato ad incollare il testo non ASCII direttamente in una stringa letterale in un file sorgente e ho salvato il file come UTF-8. Guardando il file sorgente in un editor esadecimale ha confermato che è stato salvato come UTF-8, ma che ancora non fa quello che vuoi. Al momento della compilazione, quei byte sono mappati a un carattere nella codepage corrente o viene visualizzato un avviso.

Quindi il modo più portabile per creare una stringa letterale in questo momento è scrivere esplicitamente gli ottetti come si è fatto.

Se si desidera eseguire una conversione in fase di esecuzione, ci sono un paio di opzioni.

  1. L'API di Windows ha WideCharToMultiByte, che può richiedere un testo come UTF-16 e convertirlo in multibyte codifiche come UTF-8.
  2. Se si utilizza una nuova versione del compilatore e del runtime C++, è possibile utilizzare std::codecvt per trasformare la stringa di caratteri estesa in UTF-8.

È possibile utilizzare una di queste tecniche per scrivere una piccola utilità che esegue la conversione e le emette come ottetti espliciti necessari per una stringa letterale. È quindi possibile copiare e incollare l'output nel codice sorgente.

+0

Sembra che ci sia un modo come puoi vedere dal commento di Jigsore, ma la tua risposta è anche utile, grazie! –