Pergunta

Existe um portátil wchar_t em C++?No Windows, seus 2 bytes.Em tudo o resto é 4 bytes.Eu gostaria de usar wstring na minha aplicação, mas isso vai causar problemas se eu decidir para baixo da linha para a porta.

Foi útil?

Solução

Se você estiver lidando com o uso interno do programa, não se preocupe com isso; Um wchar_t na classe A é o mesmo da classe B.

Se você planeja transferir dados entre as versões Windows e Linux/Macosx, você tem mais do que WcHar_T para se preocupar e precisa criar meios para lidar com todos os detalhes.

Você pode definir um tipo que você definirá como quatro bytes em todos os lugares e implementar suas próprias seqüências de caracteres etc. (já que a maioria dos lidar com texto em C ++ é modelada), mas não sei o quão bem isso funcionaria para suas necessidades.

Algo como typedef int my_char; typedef std::basic_string<my_char> my_string;

Outras dicas

O que você quer dizer por "portátil wchar_t"?Há um uint16_t tipo que é de 16 bits de largura em toda a parte, que muitas vezes está disponível.Mas, é claro, não compõem uma cadeia de caracteres ainda.Uma seqüência de caracteres tem para saber de sua codificação para tornar a sensação de funções como length(), substring() e assim por diante (para que ele não corte caracteres no meio de um ponto de código quando estiver usando utf-8 ou 16).Há alguns unicode compatível classes de cadeia eu sei que você pode usar.Todos podem ser usados em programas comerciais de graça (o Qt vai ser compatível com programas comerciais de graça em um par de meses, quando o Qt 4.5 for lançado).

ustring do gtkmm projeto.Se você programa com gtkmm ou usar glibmm, que deve ser a primeira escolha, ele usa utf-8 internamente. Qt também tem uma classe string, chamado QString.É codificado em utf-16. ICU é outro projeto que cria portátil de seqüência de caracteres unicode classes, e tem um UnicodeString de classe que, internamente, parece ser codificados em utf-16, como o Qt.Ainda não utilizados que um porém.

O padrão C ++ 0x proposto terá char16_t e char32_t tipos. Até então, você terá que voltar ao uso de números inteiros para nãowchar_t tipo de caractere.

#if defined(__STDC_ISO_10646__)
    #define WCHAR_IS_UTF32
#elif defined(_WIN32) || defined(_WIN64)
    #define WCHAR_IS_UTF16
#endif

#if defined(__STDC_UTF_16__)
    typedef _Char16_t CHAR16;
#elif defined(WCHAR_IS_UTF16)
    typedef wchar_t CHAR16;
#else
    typedef uint16_t CHAR16;
#endif

#if defined(__STDC_UTF_32__)
    typedef _Char32_t CHAR32;
#elif defined(WCHAR_IS_UTF32)
    typedef wchar_t CHAR32;
#else
    typedef uint32_t CHAR32;
#endif

De acordo com o padrão, você precisará se especializar char_traits Para os tipos inteiros. Mas no Visual Studio 2005, eu saí com std::basic_string<CHAR32> sem manuseio especial.

Eu pretendo usar um banco de dados SQLite.

Então você precisará usar o UTF-16, não wchar_t.

A API SQLITE também possui uma versão UTF-8. Você pode querer usar isso em vez de lidar com o wchar_t diferenças.

Minha sugestão. Use UTF-8 e STD :: String. Strings amplas não trariam muito valor agregado. Como você não pode interpretar o caráter amplo como uma carta como alguns caracteres criados de vários pontos de código Unicode.

Portanto, use em qualquer lugar UTF-8 e use a boa biblioteca para lidar com idiomas naturais. Como, por exemplo, boost.locale.

Idéia ruim: defina algo como typedef uint32_t mychar; é ruim. Como você não pode usar o iostream, você não pode criar, por exemplo, a StringStream com base nesse personagem, pois não seria capaz de escrever nele.

Por exemplo, isso não funcionaria:

std::basic_ostringstream<unsigned> s;
ss << 10;

Não criaria uma string para você.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top