it-swarm.dev

Como gravar um std :: string em um arquivo de texto UTF-8

Eu só quero escrever algumas linhas simples para um arquivo de texto em C++, mas eu quero que elas sejam codificadas em UTF-8. Qual é a maneira mais fácil e simples de fazer isso?

55
poiloi

A única maneira de o UTF-8 afetar std::string é que size(), length() e todos os índices são medidos em bytes, não em caracteres.

E, como aponta o sbi, incrementar o iterador fornecido por std::string vai avançar por byte, não por caractere, então pode realmente apontar para o meio de um ponto de código UTF-8 multibyte. Não há um iterador compatível com UTF-8 fornecido na biblioteca padrão, mas há alguns disponíveis no 'Net.

Se você se lembrar disso, você pode colocar UTF-8 em std::string, escrevê-lo em um arquivo, etc., tudo da maneira usual (o que significa que você usaria um std::string sem UTF-8 dentro).

Você pode querer iniciar seu arquivo com uma marca de ordem de byte para que outros programas saibam que é UTF-8.

53
Ben Voigt

Existe uma pequena biblioteca do Nice para trabalhar com o utf8 a partir de c ++: utfcpp

24
denys

libiconv é uma ótima biblioteca para todas as nossas necessidades de codificação e decodificação.

Se você estiver usando o Windows, você pode usar WideCharToMultiByte e especificar que deseja UTF8.

10
Brian R. Bondy

Qual é a maneira mais fácil e simples de fazer isso?

O mais intuitivo e fácil manuseio do utf8 em C++ é com certeza usar um drop-in substituto para std::string. Como a internet ainda não tem um, eu fui implementar a funcionalidade sozinho:

tinyutf8 (EDIT: agora Github).

Esta biblioteca fornece um pré-posicionamento drop-in muito leve para std::string (ou std::u32string, se preferir, porque você itera sobre codepoints e não chars). O Ity é implementado com sucesso no meio entre o acesso rápido e o pequeno consumo de memória, embora seja muito robusto. Esta robustez para seqüências UTF8 'inválidas' torna (quase completamente) compatível com ANSI (0-255).

Espero que isto ajude!

9
Jakob Riedle
std::wstring text = L"Привет";
QString qstr = QString::fromStdWString(text);
QByteArray byteArray(qstr.toUtf8());    
std::string str_std( byteArray.constData(), byteArray.length());
5
Serov Danil

Minha preferência é converter para e de um std :: u32string e trabalhar com codepoints internamente, então converter para utf8 ao gravar em um arquivo usando these iterators de conversão eu coloco no github.

#include <utf/utf.h>

int main()
{
    using namespace utf;

    u32string u32_text = U"ɦΈ˪˪ʘ";
    // do stuff with string
    // convert to utf8 string
    utf32_to_utf8_iterator<u32string::iterator> pos(u32_text.begin());
    utf32_to_utf8_iterator<u32string::iterator> end(u32_text.end());

    u8string u8_text(pos, end);

    // write out utf8 to file.
    // ...
}
0
rmawatson