vector<byte> & string

0

Jak wektor<byte> czyli unsigned char, przekształcić na napis UTF-8 ?
Czyli 2 bajty na znak ?

Dobra to inaczej:
Przepisuję program z C# do C++ ; Mam wektor<byte> i teraz potrzebuję dwóch funkcji:

System.Text.Encoding.ASCII.GetString(wektor);
System.Text.Encoding.UTF8.GetString(wektor);

jakaś podpowiedź ? W tym wektorze przechowuje przecież char'y. Wystarczy je tylko 'Skleić' do string'a ?

0

algorytm kodowania i dekodowania UTF-8 jest na wikipedii i w milionie innych miejsc.
stare wersje standardu przewidywały sekwencje od 1 do 6 bajtów, w nowszych skrócono do maksymalnie 4.
w zasadzie wszystko jedno którą zaimplementujesz.

0

etam, chyba nie jestem pierwszy z takim problemem ?
Wolałbym coś gotowego :)

0

Jeśli możesz z tego wektora zrobić byte[] (lepiej) albo byte* (ostatecznie) to System.Text.Encoding robi wszystko za ciebie.

System.Text.Encoding.UTF8.GetString(bytes);

Co to za wektor nie mam pojęcia bo w C# czegoś takiego w standardzie nie ma (najbliższym odpowiednikiem wektora z C++ jest w C# List<T>).

Przepisuję program z C# do C++

Zastanawiam się nad tym zdaniem - w C# nie ma wektora a w C++ - nie ma stringów utf-8. (jest string i wstring). Nie miało być przypadkiem odwrotnie?

0

w C++ ?

0

MSM słusznie zauważył, że w standardowej bibliotece, dla typów string/wstring nie istnieje coś takiego jak kodowanie. string i wstring to po prostu określony ciąg typów char bądź wchar. Nie można powiedzieć, że w string będzie ANSI, a w wchar na pewno unicode. Bo jaki unicode? wchar_t może mieć 16 bitów, może mieć 32. Równie dobrze możesz przechowywać napis UTF-8 w char* (i bardzo dużo aplikacji tak robi). Kwestia interpretacji kodowania występuje dopiero przy operowaniu na pojedynczych znakach (np. wyświetlanie).
Co chcesz zrobić z tym napisem, gdzie go dalej przekazać?

0

Napisałem coś takiego, mógłby ktoś skorygować ?
Ogonki nie działają ;D

uint64_t HexToInt(std::vector<uint8_t> & vec, int from = 0, int to = -1)
{
    uint64_t val = 0;
    size_t cnt;
    if(to == -1)
        cnt = int(vec.size() - 1);
    else
        cnt = to;

    for(int i = cnt; i >= from; --i)
        val += vec[i] * pow(256, cnt - i);
    return val;
}


wstring ByteToUTF8(std::vector<uint8_t> & vec)
{
    const uint8_t bitUTF[] = {0, 192, 224, 240, 248, 252};
    wstring str;
    size_t i = 0;

    while(i < vec.size())
    {
        int j;
        for(j = 5; j >= 0; --j)
            if((bitUTF[j] & vec[i]) == 0)
                break;

        int asd = HexToInt(vec, i, i + j);

        str += wchar_t(asd);
        i += j + 1;
    }
    return str;
}
0

HexToInt

myląca nazwa, i zupełnie niepotrzebne użycie funkcji pow.

wstring ByteToUTF8(std::vector<uint8_t> & vec)

czegoś tu nie rozumiem. w jakim formacie jest string wejściowy, a w jakim wyjściowy?
nie powinno być odwrotnie?

0

na wejsciu jest wrktor bajtow, na wyjsciu ma byc string utf8. Byc moze wstring niepotrzebnie uzylem.

0

UTF8

widzę że na Wiki jest błąd :
Mapowanie znaków Unikodu na ciągi bajtów:

0x00 do 0x7F - bity 0xxxxxxx, gdzie iksy to bity od najwyższego licząc
0x80 do 0x7FF - bity 110xxxxx 10xxxxxx
0x800 do 0xFFFF - bity 1110xxxx 10xxxxxx 10xxxxxx
0x10000 do 0x1FFFFF - bity 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

to co ze znakam ktory piewszy bajt jest typu : 1XXXXXXX ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1