[C++] UTF-8 encoding

Pagina: 1
Acties:

  • Akerboom
  • Registratie: Juni 2001
  • Laatst online: 26-05 08:56

Akerboom

Codito, ergo sum

Topicstarter
ik gebruik een gewone c++ fstream om in mijn Linux programma een mailtje weg te schrijven naar een bestand.
Nu wil ik deze met UTF-8 encoding wegschrijven, alleen heb ik geen idee hoe.

Op google vind ik heel veel, maar weinig over C++. Wel heb ik een C manier gevonden d.m.v. printf:
C:
1
2
3
4
5
6
7
8
9
10
11
12
13
  #include <stdio.h>
  #include <locale.h>

  int main()
  {
    if (!setlocale(LC_CTYPE, "")) {
      fprintf(stderr, "Can't set the specified locale! "
              "Check LANG, LC_CTYPE, LC_ALL.\n");
      return 1;
    }
    printf("%ls\n", L"Schöne Grüße");
    return 0;
  }

bron: http://www.cl.cam.ac.uk/~mgk25/unicode.html

Hoe ik hier mijn c++ string in UTF-8 weg kan schrijven weet ik niet, het brengt jullie misschien op een idee.

[edit]
Moet ik misschien iets met het wstring type doen?

[ Voor 10% gewijzigd door Akerboom op 25-11-2003 13:22 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:32

.oisyn

Moderator Devschuur®

Demotivational Speaker

Daar schrijf je een unicode string van 16 bytes bits per character, dat is wat anders dan een utf-8 string.

Unicode strings in C(++) zijn gemaakt van wchar_t *
Maar het equivalent in C++ is idd om gebruik te maken van wstring, wcout, wfstream e.d. (gewoon de varianten met een w ervoor dus)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Akerboom
  • Registratie: Juni 2001
  • Laatst online: 26-05 08:56

Akerboom

Codito, ergo sum

Topicstarter
ok, maar unicode is dus geen UTF-8 ... dus heb ik er nog niets aan?

Hier staat ook veel informatie:
http://www.icewalkers.com/Linux/Howto/Unicode-HOWTO-6.html

Ga nu even kijken naar iconv: http://www.gnu.org/software/libiconv

Wel een hoop gedoe allemaal, had gehoopt dat het allemaal was makkelijker zou zijn.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:32

.oisyn

Moderator Devschuur®

Demotivational Speaker

Kun je niet gewoon unicode mailtjes sturen? Dat wordt over het algemeen ook wel ondersteund...

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Akerboom
  • Registratie: Juni 2001
  • Laatst online: 26-05 08:56

Akerboom

Codito, ergo sum

Topicstarter
ja daar zat ik ook aan te denken, ik denk dat ik dat maar eens gaan doen... ben dat hele UTF-8 gebeuren meer dan zat :)

Verwijderd

Kijk eens op de volgende site. Hier staat een voorbeeld hoe je UTF-8 kan encoden en decoden.

http://www.codeproject.com/string/UTF8.asp

  • GrimaceODespair
  • Registratie: December 2002
  • Laatst online: 05:27

GrimaceODespair

eens een tettenman, altijd ...

Ik dacht dat UTF-8 wel unicode was, net zo goed als UTF-16 dat is, alleen kan ie minder entities adresseren.

Is UTF-8 niet gewoon een speciale manier van encoderen die compatibel is met ASCII? En komt dat w_char gedoe dan niet overeen met UTF-16? Dat zou wel weer impliceren dat je gewoon char's zou kunnen wegschrijven om UTF-8 te schrijven...

Heb er laatst een uiterst interessant en helder stuk over gelezen, maar blijkbaar is de helft alweer door mijn zeef gevallen.

Wij onderbreken deze thread voor reclame:
http://kalders.be


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:32

.oisyn

Moderator Devschuur®

Demotivational Speaker

Het valt idd allemaal onder de unicode standaard. De unicode onder windows en linux in C++ (dus: L"Dit is een unicode string") is UCS-2, waarbij elke char gewoon 2 octets is. UTF-8 en UTF-16 zijn Unicode Transformation Formats om UCS-4 chars te encoderen in resp. 8 bits en 16 bits chars.

utf-8 en utf-16 zijn dus multibyte strings, aangezien 1 char een variabel aantal bytes kan bevatten. Het nadeel is dat je bijvoorbeeld niet gewoon de lengte van een string kan opvragen door gewoon het aantal bytes te tellen, je moet voor elke char kijken hoe ie geencode is. Bij USC-2 heb je dat niet: daar is elke char gewoon altijd 16 bits

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • GrimaceODespair
  • Registratie: December 2002
  • Laatst online: 05:27

GrimaceODespair

eens een tettenman, altijd ...

Sorry voor het hijacken van dit topic, maar het begint mij langzaam weer te dagen :) Een UTF-8 string is dankzij die transformatie wel te lezen door antieke ASCII-readers, maar andersom is een antieke ASCII-string niet automatisch UTF-8? Klopt dat?

Wij onderbreken deze thread voor reclame:
http://kalders.be


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:32

.oisyn

Moderator Devschuur®

Demotivational Speaker

Nou ja eigenlijk wel, want ascii specificeert de onderste 128 (0 t/m 127) chars, en die chars worden als 1 byte geencode in UTF-8. Alle originele ascii chars ondervinden dus geen transformatie, en dus werkt een ascii string automatisch als utf-8 :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Akerboom
  • Registratie: Juni 2001
  • Laatst online: 26-05 08:56

Akerboom

Codito, ergo sum

Topicstarter
ja, dat maakt UTF-8 nou zo lastig te implementeren...

@johan34: die link kwam bij mij ook bovenaan bij google... en ik vind die code maar niets en kan die ook niet 123 omzetten naar bruikbare code in mijn programma.


[edit]

@.oisyn: welke "charset" moet ik dan gebruiken in de mail header? (bij gebruik van UCS-2)

[ Voor 20% gewijzigd door Akerboom op 25-11-2003 15:48 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 15:32

.oisyn

Moderator Devschuur®

Demotivational Speaker

Hier staat een interessant stukje geschiedenis over ASCII, unicode, UCS-2 en UTF-8

johan34: Ik weet niet wat ze daar bij codeproject aan het doen zijn, maar chars converteren naar dingen als =94 lijkt me geen UTF-8 encoding. Zelfs de pagina die ze geven zegt dat het anders moet :?

TormentoR: geen idee, ik weet niet wat de default unicode charset voor linux is 8)7

[ Voor 12% gewijzigd door .oisyn op 25-11-2003 16:01 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
ok, tijd om wat dingen recht te zetten.

C++ heeft geen standaard support voor Unicode. wchar_t en het bijbehorende string type, wstring zijn soms geschikt. Omdat Unicode als belangrijk gezien wordt is het vaak wel geprobeerd om wchar_t Unicode te maken. Op UNIX is dat redelijk gelukt, wchar_t i daar vaak een 32 bits type en dat is groot genoeg voor 20 bits Unicode. Op Windows is wchar_t 16 bits, en dat is alleen genoeg voor de verouderde 16 bits Unicode. Inmiddels zijn er Unicode karakters met code point >65536, en die passen niet in een MSVC wchar_t

Als je een wchar_t naar disk wil schrijven krijg je te maken met codecvt. Dit is een manier op character sets op encodings te mappen. UTF-8 is zo'n encoding, en dus kun je daar een codecvt voor maken. Je kunt ook de Dinkumware Core-X library kopen, daar zit die codecvt al in.

Tenslotte, 16 bytes voor een character type is voorlopig wel genoeg om de alfabetten van alle menselijke talenm en alle aliens in de buurt mee te encoden ;)

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • GrimaceODespair
  • Registratie: December 2002
  • Laatst online: 05:27

GrimaceODespair

eens een tettenman, altijd ...

MSalters schreef op 26 november 2003 @ 01:27:
Als je een wchar_t naar disk wil schrijven krijg je te maken met codecvt. Dit is een manier op character sets op encodings te mappen. UTF-8 is zo'n encoding, en dus kun je daar een codecvt voor maken.
Je kunt toch ook gewoon je w_chars wegschrijven zonder transformation? Is dat dan niet gewoon UCS-2 (16 bit) of UCS-4 (32 bit)? Dat niet-unicode-apps er dan problemen mee krijgen (itt UTF-8), is wat anders.

Wij onderbreken deze thread voor reclame:
http://kalders.be

Pagina: 1