Cadeias de plataforma cruzada (e Unicode) em C ++
Finalmente, voltei à minha tarefa principal - portar um projeto C ++ bastante grande do Windows para o Mac.
Imediatamente fui atingido pelo problema em que wchar_t é de 16 bits no Windows, mas de 32 bits no Mac. Esse é um problema porque todas as cadeias de caracteres são representadas por wchar_t e haverá dados de cadeia indo e voltando entre máquinas Windows e Mac (nos dados em disco e nos formulários de dados de rede). Devido à maneira como funciona, não seria totalmente fácil converter as strings em algum formato comum antes de enviar e receber os dados.
Também começamos a oferecer suporte a muito mais idiomas recentemente e, portanto, estamos começando a lidar com muitos dados Unicode (além de lidar com idiomas da direita para a esquerda).
Agora, eu poderia estar misturando várias idéias aqui e causando mais problemas para mim do que o necessário, e é por isso que estou fazendo essa pergunta. Estamos pensando que armazenar todos os nossos dados de string na memória como UTF-8 faz muito sentido. Resolve o problema de tamanho diferente de wchar_t, significa que podemos suportar facilmente vários idiomas e também reduz drasticamente nossa pegada de memória (temos MUITAS cordas carregadas na maior parte em inglês), mas não parece que muitas pessoas estejam fazendo esta. Está faltando algo? Há o problema óbvio com o qual você precisa lidar, onde o comprimento da string pode ser menor que o tamanho da memória que armazena esses dados.
Ou usar o UTF-16 é uma idéia melhor? Ou devemos nos ater ao wchar_t e escrever código para converter entre wchar_t e, digamos, Unicode em locais onde lemos / gravamos no disco ou na rede?
Sei que isso está perigosamente perto de pedir opiniões - mas estamos nervosos por estarmos ignorando algo óbvio porque não parece haver muitas classes de strings Unicode (por exemplo) - mas ainda há muito código para converter para / do Unicode como em boost :: locale, iconv, utf-cpp e ICU.