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

Schwarzefee

Treue Seele

  • »Schwarzefee« ist der Autor dieses Themas

Beiträge: 155

Wohnort: Ost-Sachsen

Beruf: Programmierer

  • Private Nachricht senden

1

27.03.2014, 09:49

[C++] Encoding

Hi,

ich muss mich mich im Moment mit Zeichencodierung beschäftigen.

Ich arbeite dabei u.A. mit UTFCPP.

Wie kann ich im Quellcode einen validen UTF8 String erstellen?
Ich möchte die Anzahl an Zeichen eines Strings ermitteln. Dazu wollte ich utf8::distance() verwenden.
Wenn ich einen String im Quellcode festlege, der sowohl ASCII- als auch Umlauten enthält

C-/C++-Quelltext

1
std::string test = "abc äöü";

Zählt utf8::distance() anscheinend nur die Umlaute.

Ich habe im Internet u.A. u8"UTF-String" gefunden, leider funktioniert das im VS Express 2012 anscheinend nicht.


Gruß

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

27.03.2014, 17:17

Hmm interessante Frage-was passiert wenn du die Quellcodedatei explizit mit UTF8 encoding abspeichert? kA ob der kompiler das korrekt erkennt. Ich habe immer nur mit "raw data" gearbeitet und zum Zählen der UTF8 Zeichen folgendes genutzt:

C-/C++-Quelltext

1
2
3
4
inline size_t wcs2mbslen(const wchar_t* wcstring)
{
    return WideCharToMultiByte(CP_UTF8,0,wcstring,-1,0,0,0,0);
}
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

3

27.03.2014, 17:26

Ja, speichere die Datei als UTF-8 ab, dann dürfte es funktionieren. Es sei allerdings gesagt, dass utf8::distance() nur die Anzahl der Unicode Codepoints liefert, welche nicht wirklich der Anzahl der "Zeichen" entspricht. Was genau hast du denn vor?

Schwarzefee

Treue Seele

  • »Schwarzefee« ist der Autor dieses Themas

Beiträge: 155

Wohnort: Ost-Sachsen

Beruf: Programmierer

  • Private Nachricht senden

4

27.03.2014, 17:29

Hi,

ich bastle grad an einer einfachen Font-Engine für ein Spiel.
Die Fonts werden mit BMFont erstellt.



Gruß

Schwarzefee

Treue Seele

  • »Schwarzefee« ist der Autor dieses Themas

Beiträge: 155

Wohnort: Ost-Sachsen

Beruf: Programmierer

  • Private Nachricht senden

5

27.03.2014, 18:25

Hi,

ich hab jetzt mit Hilfe von UTFCPP versucht was hinzubekommen, leider funktioniert das nur mit "normalen" Zeichen

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
std::vector<int> Unicode::GetCodepointsFromUTF8(std::string utf8string)
{
    std::vector<int> Return;

    try
    {
        char* str = (char*)utf8string.c_str();      // utf-8 string
        char* str_i = str;                          // string iterator
        char* end = str+strlen(str)+1;              // end iterator

        do
        {
            uint32_t code = utf8::next(str_i, end); // get 32 bit code of a utf-8 symbol
            if (code == 0)
            {
                continue;
            }

            Return.push_back(code);
        }
        while ( str_i < end );
    }
    catch (utf8::exception e)
    {
        return std::vector<int>();
    }

    return Return;
}


Allerdings liefert mir die Methode zB für "ö" 65533.

Was mach ich da falsch?

EDIT: Ok, die Quellcode Datei war noch nicht UTF8 gespeichert.
Wie kann man im Visual Studio Express 2012 einstellen, dass alle Dateien standardmäßig in UTF8 gespeichert werden sollen?


Gruß

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Schwarzefee« (27.03.2014, 18:42)


Schwarzefee

Treue Seele

  • »Schwarzefee« ist der Autor dieses Themas

Beiträge: 155

Wohnort: Ost-Sachsen

Beruf: Programmierer

  • Private Nachricht senden

6

29.10.2014, 20:12

Hi,

nach langer Zeit muss ich den Thread nochmal rausholen, da ich im Moment wieder vor dem gleichen Problem stehe.

Ich hab Visual Studio so eingestellt, dass die Quellcode-Dateien in UTF8 gespeichert werden.

C-/C++-Quelltext

1
this->CharacterList = " äöüÄÖÜß!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~";

Allerdings zeigt mir der Debugger für "ä" den Wert "-28", für "ö" den Wert "-10" etc.. Ich denke da liegt irgendwo der Fehler.

Die GetCodepointsFromUTF8()-Funktion (im vorherigen Post) wirft eine utf8::exception, wenn es zu einem Umlaut kommt.

Kann mir jemand weiterhelfen?


Gruß

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

7

29.10.2014, 20:30

Nach meinem Wissen kann man nicht einstellen, dass Visual Studio *immer* in UTF8 speichert. Man kann maximal einstellen, dass es UTF8 benutzt, wenn Zeichen im Code vorkommen, die sonst nicht gespeichert werden können. ÄÖÜ gehen aber stressfrei im Windows-Standard-Encoding Win-1252. Die Datei ist also weiterhin vermutlich kein UTF8, was auch Deine Exception erklären würde. Dass der Debugger negative Zahlen anzeigt, dürfte daran liegen, dass char von Haus aus vorzeichenbehaftet ist. Das ist also eine reine Anzeigefrage, kein logisches Problem.

Du kannst nur eins tun: immer wieder darauf achten, dass jede Datei mal als UTF8 gespeichert wird. Das musst Du aber manuell für jede Datei machen, VS speichert das pro Datei.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

29.10.2014, 21:16

Du kannst die Datei ja auch mal mit Notepad++ öffnen und nachprüfen, wie sie kodiert ist.

Schwarzefee

Treue Seele

  • »Schwarzefee« ist der Autor dieses Themas

Beiträge: 155

Wohnort: Ost-Sachsen

Beruf: Programmierer

  • Private Nachricht senden

9

30.10.2014, 09:58

Hi,

Problem gelöst, die Datei war wirklich nicht als UTF8 gespeichert ;)

Gibt es sonst keine Lösung, in VS Express 2013 neue und vorhandene Dateien automatisch als UTF8 abzuspeichern?

Zum Glück ist mein Projekt noch recht klein. Muss ich also alle Dateien per Hand aufmachen und als UTF8 speichern?
Oder gibts da nen Tool oder sowas?



Gruß

10

30.10.2014, 10:12

Du könntest auch "einfach" Direct2D zusammen mit Direct3D10 und Direct3D11 benutzen, um mit Direct2D einen Text in eine Textur zu rendern und die in Direct3D11 zu nutzen. Ist etwas umständlich, ich kann ja nachher - wenn ich Zeit finde - mal meinen bisherigen Code in einem Tutorial posten. Das funktioniert aber dann halt nur unter Windows. Aber für OpenGL gibt es bestimmt auch Bibliotheken, die sowas können.

http://xboxforums.create.msdn.com/forums…939/615166.aspx - Das Tutorial hab ich damals benutzt, um das Font Rendering in meinem Spiel umzusetzen.
Cube Universe
Entdecke fremde Welten auf deiner epischen Reise durchs Universum.

Werbeanzeige