PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sonderzeichen in C herausfinden ... !?


Liszca
2014-12-02, 09:54:25
Die sonderzeichen der deutschen sprache habe ich gefunden, ich würde jedoch gerne kyrilliza verwenden und habe nicht rausgefunden wie man diese bekommt.

Berni
2014-12-03, 00:50:41
Das ist eine andere Codepage.
Wenn du deutsche Sonderzeichen zeitgleich brauchst müsstest du Unicode verwenden. Ist möglich, aber habe ich noch nie gemacht und ist denke ich nicht ganz trivial weil man dann andere Funktionen nutzen muss (die Standard-String-Funktionen gehen von einem Byte pro Buchstabe aus) bzw. externe Libraries.

Vielleicht kannst du mal erklären was du genau vor hast?

Ectoplasma
2014-12-03, 07:37:44
Gebe bitte einmal deine Zielplattform an. Falls diese OSX, oder eine Linux Variante sein sollte, benutzt du einfach UTF-8. Damit funktionieren auch alle Standard C Funktionen, selbst printf, da die Consolen ebenfalls UTF-8 unterstützen. Anders ist es unter Windows. Kein einziges Ausgabe-API, sei es nun ein Fenster, oder die Konsole, unterstützt UTF-8. Du musst alle Zeichen vor der Ausgabe nach UTF-16 umwandeln, oder komplett mit UTF-16 arbeiten, was aber zur Folge hat, dass du unter Umständen Funktionen benutzen musst, die nicht portabel sind, bzw. auf anderen Plattformen nicht zur Verfügung stehen. Windows ist da ein ziemlicher Krampf.

Liszca
2014-12-03, 09:25:21
würde gerne einen vokabeltrainer für russisch bauen, einfach um programmieren zu üben und eben russisch.

PHuV
2014-12-03, 17:18:44
Ich habe vor einigen Jahren alles selbst in C programmieren müssen, gerade UTF-8 muß man wirklich byteweise vergleichen, weil Zeichen dann 2-7 Bytes lang sein können.

Mit Java kann man bzgl. Zeichensätze deutlich komfortabler arbeiten.

Mosher
2014-12-03, 23:10:18
Je nach dem, was du genau wie vorhast, böte sich auch eine selbsterstellte Zeichentabelle/Lookup-Tabelle an.

Oder du suchst nach fertigen UTF-8 Bibliotheken für C. Da findet sich schon bisschen was. :)

PHuV
2014-12-04, 12:53:04
Gibts da mittlerweile was vernünftiges? Ich hab schon lange nicht mehr in C entwickelt, mein letzter Standard war C99.

samm
2014-12-04, 13:09:40
C++ 11 hat Support dabei. Wenn es C sein muss, könnte ICU (http://site.icu-project.org/) gut sein, habe ich aber nie genutzt.

Ansonsten vielleicht noch hilfreich:
http://stackoverflow.com/questions/4607413/c-library-to-convert-unicode-code-points-to-utf8

Alt (2005), nicht selbst gelesen sondern nur ergoogelt:
http://www.cprogramming.com/tutorial/unicode.html

Ectoplasma
2014-12-04, 20:33:28
Ich habe vor einigen Jahren alles selbst in C programmieren müssen, gerade UTF-8 muß man wirklich byteweise vergleichen, weil Zeichen dann 2-7 Bytes lang sein können.

Ist so nicht ganz richtig. Erstens ist UTF-8 1-4 Bytes lang und zweitens haben 98% aller C Funktionen überhaupt kein Problem mit UTF-8. Wichtig wird es erst, wenn man bei Funktionen wie 'strlen', die Anzahl der Zeichen und nicht die Anzahl der Bytes haben möchte. Bei Upper -und Lower-Case Funktionen muss man ebenfalls aufpassen. UTF-8 hat eine gewisse Abwärtskompatibiltät. So ist z.B. garantiert, dass die Zahl 0 nicht ein Teil eines Zeichens sein kann, sondern immer nur den Abschluss eines Strings bilden kann. So wie es in C üblich ist.

Also, es ist nicht so kompliziert. Aber es stimmt auch, dass Java besseren Support bietet.

Marscel
2014-12-04, 21:39:22
Die sonderzeichen der deutschen sprache habe ich gefunden, ich würde jedoch gerne kyrilliza verwenden und habe nicht rausgefunden wie man diese bekommt.

Bevor du dich an die Implementierung machst: Arbeite dich in Encodings und Endians ein. Was zeichnet ASCII aus, was ISO-8859-1, was UTF-8/16/32, was ist mit Unicode gemeint, wo sind Dinge einfach austauschfähig, wo nicht, ...

PHuV
2014-12-05, 00:24:03
Ist so nicht ganz richtig. Erstens ist UTF-8 1-4 Bytes lang
Das ist mir neu, es wurde überarbeitet, wußte ich nicht. Ich kenne eben noch die alte Spezifikation, als ich das Programmieren mußte (ist ja schon ein paar Jährchen her), und dort hieß es 1 Anfangsbyte, 1 Endbyte + 6 Nutzerbytes
http://en.wikipedia.org/wiki/UTF-8

The patterns below are not part of UTF-8, but were part of the first specification.
26 U+200000 U+3FFFFFF 5 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
31 U+4000000 U+7FFFFFFF 6 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
The original specification covered numbers up to 31 bits (the original limit of the Universal Character Set). In November 2003, UTF-8 was restricted by RFC 3629 to end at U+10FFFF, in order to match the constraints of the UTF-16 character encoding. This removed all 5- and 6-byte sequences, and about half of the 4-byte sequences.
und zweitens haben 98% aller C Funktionen überhaupt kein Problem mit UTF-8. Wichtig wird es erst, wenn man bei Funktionen wie 'strlen', die Anzahl der Zeichen und nicht die Anzahl der Bytes haben möchte.
Moment. Ja, sie haben kein Problem damit, aber die Probleme fangen an, wenn Du per Zeiger und Zähler Strings durchsuchst, da mußt Du immer prüfen, was ist das erste Byte, und wieviele Bytes kommen noch. Dann kann man keine Stringvergleiche usw. machen. Deine 98% sind zu optimistisch.
Also, es ist nicht so kompliziert. Aber es stimmt auch, dass Java besseren Support bietet.
Wenn Du es in Anwendungen reinbauen mußt, wird es kompliziert. Du kannst Dich weder auf Stringlängen verlassen, noch kannst Du sinnvoll suchen, vergleichen etc. Das mußt Du alles mit eigenen Funktionen selbst schreiben. Ganz übel wird es, wenn die Anwendungen nach wie vor intern mit ASCII 8 Bit arbeiten. Feldlängen werden regelmäßig gesprengt, sobald ein UTF-8 vorkommt. Ist "daß" nun 3 oder 4 Zeichen lang? Siehe Dein strlen-Beispiel. Und schau doch nur mal alle C-Funktionen mit Stringbearbeitungen an, da geht es immer schön per Zeiger ein Byte weiter.

Da ist Java wirklich eine große Erleichterung, weil Du eben hier nicht (wenn korrekt programmiert wurde) sämtliche Funktionen usw. anpassen mußt.

In Oracle DB haben sie es ganz einfach gelöst. Die interne Verarbeitung war vorher max. 4000 Zeichen pro Objekt, daß wurde dann einfach auf 2000 bzw. 1000 Zeichen für UTF-8/16/32 gekürzt. :lol:

Berni
2014-12-05, 00:31:31
Dann wäre UTF-16 aber praktischer als UTF-8, weil das einfach generell 2 Bytes braucht (für die gebräuchlichen Zeichen) und man somit deutlich einfacher damit arbeiten kann. Java nutzt das ja auch intern.

Coda
2014-12-05, 03:05:44
Nein, UTF-16 braucht nicht immer zwei Bytes. Manchmal auch vier. Somit hat es keinen Vorteil gegenüber UTF-8.

Das einzige was immer gleich viel Platz braucht ist UCS4/UTF-32.

Ectoplasma
2014-12-05, 08:05:25
Deine 98% sind zu optimistisch.

Hmm ... vielleicht.


Und schau doch nur mal alle C-Funktionen mit Stringbearbeitungen an, da geht es immer schön per Zeiger ein Byte weiter.


Aber genau das ist doch kein Problem und Stringvergleiche funktionieren ohne jedes Zutun perfekt. Man hat erst dann ein Problem, wenn man zwischen unterschiedlichen Zeichensätzen vergleichen möchte. Die Funktionen, die problematisch sind, sind sehr begrenzt. Es betrifft wirklich nur jene, bei denen du eine exakte Angabe des Zeichens benötigst. Z.B. bei den Upper und Lower Case Funktionen. C++ 11, hat aber hier Unterstüzung. Strings replacen ist auch kein Problem, es sei dann du willst einen im Quellcode statisch eingegeben Text, der zudem ein Sonderzeichen enthält und der Quellcode zudem nicht im UTF-8 Zeichensatz vorliegt, miteinander vergleichen. Dann hast du evtl. ein Problem. Wie oft kommt soetwas vor? Eher gar nicht oder?

Also, ich spreche da ein wenig aus Erfahrung. Ich biete seit Jahren eine nicht ganz kleine Anwendung im Internet an, die von hunderten von Leuten genutzt wird. Die wurde in C++ geschrieben und arbeitet intern nur mit UTF-8. Unter Windows werden Strings, bevor sie ausgegeben werden, nach UTF-16 gewandelt, weil Windows schlicht kein UTF-8 von sich aus kann. Von der Performance her ist auch alles im grünen Bereich. Unter OSX ist alles UTF-8. Man braucht sich dort um gar nichts zu kümmern.


In Oracle DB haben sie es ganz einfach gelöst. Die interne Verarbeitung war vorher max. 4000 Zeichen pro Objekt, daß wurde dann einfach auf 2000 bzw. 1000 Zeichen für UTF-8/16/32 gekürzt. :lol:

Richtig, da gibt es schöne Probleme mit Legacy Datenbanken, deren Inhalt jetzt auch im Web dargestellt werden soll :D

Berni
2014-12-08, 18:34:33
Nein, UTF-16 braucht nicht immer zwei Bytes. Manchmal auch vier. Somit hat es keinen Vorteil gegenüber UTF-8.

Das einzige was immer gleich viel Platz braucht ist UCS4/UTF-32.
Ich schrieb extra "für die gebräuchlichen Zeichen". Das gesamte Basic Multilingual Plane wird bei UTF-16 mit zwei Bytes abgedeckt und für den Einsatzzweck des Threaderstellers reicht das vollkommen.

Coda
2014-12-21, 19:30:43
Am besten einfach alles mit ICU machen und dann konvertieren für I/O (UTF-16 auf Windows, UTF-8 für Linux/Mac).

@Mirko
2014-12-26, 22:16:22
Die sonderzeichen der deutschen sprache habe ich gefunden, ich würde jedoch gerne kyrilliza verwenden und habe nicht rausgefunden wie man diese bekommt.
Wenn es nur um eine reine Belegungs-Gegenüberstellung geht, vllt. hilft das weiter:
http://www.uni-regensburg.de/EDV/Misc/KeyBoards/Keyboard_DE_RU.xls
http://www.uni-regensburg.de/sprache-literatur-kultur/slavistik/medien/rund-ums-studium/kyrvist_installieren.exe
Auswahl: http://www.uni-regensburg.de/EDV/Misc/KeyBoards/

@Mirko
2014-12-27, 00:28:54
"cyrillic" = (0x00400-0x004FF) = iso-8859-5 http://www.isthisthingon.org/unicode/index.phtml?page=U0&subpage=4