vector<byte> & string

2011-10-02 14:29
Pawel
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 ?

edytowany 1x, ostatnio: madmike, 2016-12-13 18:26
Chyba nie wiesz dokładnie o co się pytasz. Po pierwsze UTF-8 przechowuje znaki w od jednego do czterech (chyba) bajtów i tablica bajtów jest dobrym sposobem przechowywania takiego stringa. Jak chcesz się bawić z unikodem, skorzystaj z istniejących bibliotek. - Zjarek 2011-10-02 14:36

Pozostało 580 znaków

2011-10-02 15:09
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.

Pozostało 580 znaków

2011-10-02 15:42
Pawel
0

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

Pozostało 580 znaków

2011-10-02 16:16
msm
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?

edytowany 2x, ostatnio: msm, 2011-10-02 16:20

Pozostało 580 znaków

2011-10-02 16:19
Pawel
0

w C++ ?

Pozostało 580 znaków

2011-10-02 16:28
Rev
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ć?


Ja pierdziu... oni naprawdę wiedzą co zrobić, żeby język był jeszcze bardziej nieczytelny. - somekind 2011-10-02 17:15

Pozostało 580 znaków

2011-10-04 00:47
Pawel
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;
}

Pozostało 580 znaków

2011-10-04 08:10
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?

edytowany 1x, ostatnio: Azarien, 2011-10-04 08:12

Pozostało 580 znaków

2011-10-04 10:03
Pawel
0

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

a w jakim kodowaniu masz ten wektor bajtów? - Azarien 2011-10-04 12:41

Pozostało 580 znaków

2011-10-04 20:57
Pawel
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 ?

pytanie bezprzedmiotowe. odpowiedz na poprzednie: w jakim kodowaniu masz ten wektor bajtów? - Azarien 2011-10-04 21:33

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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