ubuntuusers.de

Umlaute in C++ String erkennen

Status: Ungelöst | Ubuntu-Version: Ubuntu 12.10 (Quantal Quetzal)
Antworten |

Panke

Anmeldungsdatum:
14. Oktober 2010

Beiträge: 133

Dakuan schrieb:

Ich weiß nicht, womit du C++ lernst. Aber wirf es weg.

Na, wer wird denn gleich so radikal sein. Ich gebe zwar zu, das C++ auch nicht gerade mein bester Freund ist, aber man kommt nunmal nicht immer drann vorbei.

Ich meinte das Buch/Tutorial, dass einem glauben macht, man könne einfach so einen std::string reinterpret_cast'en.

string ist ein struct. Welches bitmuster dieses struct im Speicher hat, kannst du nicht wissen. Niemand weiß das.

Ich habe das jetzt nicht überprüft (und ich bin auch zu faul dazu) aber das sollte sich aus den entsprechenden Header Dateien ermitteln lassen, wenn das nötig ist.

Mehr oder weniger. Aber kann sich aber zur nächsten Version ändern.

Dakuan

Avatar von Dakuan

Anmeldungsdatum:
2. November 2004

Beiträge: 6502

Wohnort: Hamburg

@Lysander : Möglicherweise gehört das jetzt nicht mehr hierher.

Mit meiner ungeschickten Ausdrucksweise wollte ich nur andeuten, das ich mich etwas schwer tue meine C Programme nach C++ zu migrieren.

Was sind denn die damit verbundenen Probleme? Und wie löst Du die dann selber mit kurzen eigenen Programmzeilen?

In einem Fall möchte ich z.B. die Ergebnisse von Programmen in der Konsole formatiert ausgeben. In einigen Textspalten kommen da manchmal Umlaute vor, die mir die Formatierung verbiegen, da die Byteanzahl ja nicht mehr identisch mit der Spaltenanzahl ist. Aus möglicherweise übertriebenem sportlichem Ehrgeiz habe ich darauf verzichtet die entsprechenden mb... Routinen zu bemühen und habe das Problem einfach durch folgendes gelöst:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
/* -------------------------------------------------------------------
**      sende ein Multibyte Character und melde Byteanzahl zurueck
*/
int
mbc_out( char * s )
{
    int i = 0;
    char start_byte;
    if ( *s < 0 ) {
        start_byte = *s;
        while ( start_byte & 0x80 ) {
            fputc( *s++, stdout );
            start_byte <<= 1;
            i++;
        }
        return i;
    }
    fputc( *s, stdout );
    return 1;
}

Das ist jetzt vielleicht eine etwas übertriebene Vorgehensweise, aber sie erweitert den persönlichen Horizont und das Versändnis für solche Codierungen. Ich denke, nur wenn man es mal probiert hat, weiss man, was da passiert.

Panke

Anmeldungsdatum:
14. Oktober 2010

Beiträge: 133

Auch wenn das jetzt offtopic ist:

Dakuan schrieb:

Was sind denn die damit verbundenen Probleme? Und wie löst Du die dann selber mit kurzen eigenen Programmzeilen?

In einem Fall möchte ich z.B. die Ergebnisse von Programmen in der Konsole formatiert ausgeben. In einigen Textspalten kommen da manchmal Umlaute vor, die mir die Formatierung verbiegen, da die Byteanzahl ja nicht mehr identisch mit der Spaltenanzahl ist. Aus möglicherweise übertriebenem sportlichem Ehrgeiz habe ich darauf verzichtet die entsprechenden mb... Routinen zu bemühen und habe das Problem einfach durch folgendes gelöst:

Deine Funktion löst das Problem, dass Anzahl an bytes (#bytes) != #codepoints. Aber du implizierst, dass #codepoints == #spalten. Das stimmt bei Unicode auch nicht zwingend: http://en.wikipedia.org/wiki/Combining_diacritical_mark

Dakuan

Avatar von Dakuan

Anmeldungsdatum:
2. November 2004

Beiträge: 6502

Wohnort: Hamburg

Das war mir in der Tat unbekannt, aber ich denke das die Frage sich nur auf die wenigen deutschen Umlaute bezog.

Ich benutze das bisher nur für die Konsole und desshalb habe ich mal versucht sowas im Gnometerminal darzustellen, was mir aber nicht gelungen ist. Eingegeben habe ich:

echo '<Strg+Sft+u>0079<Strg+Sft+u>0306'

Wenn ich den Artikel richtig verstanden habe, hätte da dann ein y mit einem Halbkreis drüber erscheinen sollen. Die Zeichen werden aber hintereinander ausgegeben. Hier in Firefox funktioniert das allerdings

wie man sieht. Wieder was gelernt.

stenk2001

(Themenstarter)

Anmeldungsdatum:
24. August 2013

Beiträge: 9

Entschuldigt die Unterbrechung, ich wollte nur mitteilen, dass man mit der std::string::c_str() Methode die entsprechenden Bitmuster suchen kann, das funktioniert wunderbar. Es war natürlich etwas ungeschickt von mir zu glauben, dass die C++ Strings ebenso angeordnet sind, darüber habe ich nicht nachgedacht. Das Lustige an der ganzen Geschichte ist aber, dass ich, nachdem ich nun in UTF-8 kodierten Strings/Textdateien die Umlaute ersetzen kann, festgestellt habe, dass die Textdatei aus welcher die Wörter stammen, eine völlig andere Kodierung hat. Also begebe ich mich erneut auf Bitmustersuche, diesmal auf andere ☺ Die Lösung über die fertige Library wäre wohl wesentlich einfacher gewesen, aber immerhin lernt man so eine Menge.

Vielen Dank für eure Hilfe!

Bis bald, Stenk

Antworten |