Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

26.02.2009, 19:41

[Erledigt] URL u. UNICODE-Zeichen

Also hab das "vergnügen" das ich eine Internetseite parsen muss und dafür muss ich mir leider nen URL zusammen setzen. In diesem kann es vorkommen das UNICODE-Zeichen enthalten sind.

Hab's mir mal angeguckt was Firefox ausspuckt %E8 für è scheint also im Prinzip der zugeordnete Zahlenwert in hexa zu sein, korrekt?

C-/C++-Quelltext

1
std::cout << "%" << std::hex << static_cast<unsigned short>(L'è') << std::endl;
sollte mir demnach die korrekte übersetzung liefern, oder?

Aber damit hab ich doch längst nicht alle Zeichen drin?!
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Anonymous

unregistriert

2

26.02.2009, 21:40

Vorsicht: Bei Unicode immer den Zeichensatz unterscheiden! Gut bei einem é ist das vielleicht recht trivial, aber man sollte sich an UTF-8 halten im Web-Bereich, da es dort de facto Standard ist.

Deine Methode ist nicht gut. Hier etwas von mir:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
    /// //////////////////////////////////////////////////////////////////////

    /// Encodiert einen String in eine URL-komforme Kodierung.

    ///

    /// \param value:

    ///     String der Encodiert werden soll.

    ///

    /// \return:

    ///     Der umgewandelte String.

    ///

    /// //////////////////////////////////////////////////////////////////////

    static string_type encode (const string_type& value);

    /// //////////////////////////////////////////////////////////////////////

    /// Wandelt einen char in einen Hex-Wert um und gibt diesen als String wieder.

    ///

    /// \param value:

    ///     Zeichen das umgewandelt werden soll.

    ///

    /// \return:

    ///     Das Eingabezeichen als Hex-Wert in einem String.

    ///

    /// //////////////////////////////////////////////////////////////////////

    static string_type char_to_hex (const char& value);

// [...]


/// //////////////////////////////////////////////////////////////////////////

/// Encodiert einen String in eine URL-komforme Kodierung.

/// //////////////////////////////////////////////////////////////////////////

string_type url::encode (const string_type& value)
{
    string_type result;

    const size_type length = value.length ();
    for (size_type i = 0; i < length; ++i)
    {
        if ((48 <= value[i] && value[i] <= 57) ||
            (65 <= value[i] && value[i] <= 90) ||
            (97 <= value[i] && value[i] <= 122) ||
            (value[i]=='~' || value[i]=='!' || value[i]=='*' || value[i]=='(' || value[i]==')' || value[i]=='\''))
        {
            result.append (&value[i], 1);
        }
        else
        {
            result.append ("%");
            result.append (char_to_hex (value[i]));
        }
    }
    return (result);
}

/// //////////////////////////////////////////////////////////////////////////

/// Wandelt einen char in einen Hex-Wert um und gibt diesen als String wieder.

/// //////////////////////////////////////////////////////////////////////////

string_type url::char_to_hex (const char& value)
{
    char dig1 = (value & 0xF0) >> 4;
    char dig2 = (value & 0x0F);

    if ( 0 <= dig1 && dig1 <= 9)
        dig1 += 48;
    if (10 <= dig1 && dig1 <=15)
        dig1 += 97 - 10;
    if ( 0 <= dig2 && dig2 <= 9)
        dig2 += 48;
    if (10 <= dig2 && dig2 <=15)
        dig2 += 97 - 10;

    string_type result;
    result.append (&dig1, 1);
    result.append (&dig2, 1);

    return (result);
}


Das UTF-16le erst auf UTF-8 umwandeln, dann hat man weniger Probleme.

p.s.: dies ist eigentlich eher nur für UTF-8 ausgerichtet, ob das nun auch mit "unsigned chars"*2 (wchar_t) geht, weiß ich nicht. Arbeite nur noch mit eigenen string- und char-klassen und keine STL mehr, damit ich UTF-8 problemlos benutzen kann. Willst du den code benutzen, solltest du string_type durch std::string/wstring ersetzen und size_type durch std::size_t

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

3

27.02.2009, 10:19

Das char_to_hex geht aber auch mit weniger "magic numbers". :)

Zum Beispiel:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
static inline std::string char_to_hex (const char value) 
{ 
    static const char* lookup = "0123456789abcdef";
    char tmp[3] = {0};
    tmp[0] = lookup[(value>>4)&0xf];
    tmp[1] = lookup[value&0xf];
    return std::string( tmp );
}


C-/C++-Quelltext

1
2
3
4
5
6
static inline std::string char_to_hex (const char value) 
{ 
    char tmp[3] = {0};
    sprintf( tmp, "%02x", ( unsigned char )value );
    return std::string( tmp );
}


Der hex manipulator zickt bei mir rum... :-(

Anonymous

unregistriert

4

27.02.2009, 11:10

David_pb
Danke, ich denke ich werde Variante 1 nehmen, da sprintf es bei mir nicht gibt. :)

5

27.02.2009, 15:53

Mitm std:: dafor bei mir schon :P

Aber danke für die Lösungsvorschläge :P ... hab nur festgestellt das es gewissen unregelmäßigkeiten bei der Seite gibt die geparst werden muss (imdb :P Ja is nicht erlaubt ...) ... mal sehen ob ich nich drauf verzichte (n muss) :P
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Anonymous

unregistriert

6

27.02.2009, 16:03

Deviloper
Nein, du verstehst nicht: Es gibt bei mir sogut wie keine C/C++-Runtime mehr in meinem Projekt, wenn es zum Zeichensätze geht ;)

Werbeanzeige