Probleem met exotische chars in string C++

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb hier een string met daarin "ØŒîrtèÑXÇasd.pdf" als input

De output moet zijn "ØŒîrtèÑXÇasd.pdf". Hoe zet ik hem om?

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 19:58

.oisyn

Moderator Devschuur®

Demotivational Speaker

Dat ziet eruit als een UTF-8 string. Die moet je dus omzetten naar de standaard encoding van je platform. Zie de docs van je platform om te erachter te komen hoe dat werkt (er is geen standaard C++ manier voor - of eigenlijk wel, maar dan moet je prutsen met UTF-8 locales, die ook maar net ondersteund moetten worden).

Onder Windows kun je daar MultiByteToWideChar() voor gebruiken, dan giet je 'm in een wchar_t string (zoals gebruikelijk is onder Windows).

[ Voor 38% gewijzigd door .oisyn op 08-09-2010 12:20 ]

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.


Acties:
  • 0 Henk 'm!

  • Refro
  • Registratie: November 2000
  • Laatst online: 16:22
Is wel erg weinig informatie is de eerste string gewoon incorrect weergegeven unicode? Is de 2e string unicode of ascii? Zit er een speciaal scheme in?

Je zou het eens met mbstowcs kunnen proberen, maar zonder extra informatie is hier weinig zinnigs over te zeggen.

Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 10-09 14:31
Refro, ik denk dat je niet helemaal het verschil tussen Unicode en UTF-8 kent. Beide strings zijn Unicode. Elke string is Unicode, om de simpele reden dat de Unicode karakterset alle karakters bevat.

Om een string op te slaan heb je een encoding nodig. Unicode definieert UTF-8, een encoding voor alle karakters uit de Unicode karakterset. Er zijn ook andere encodings, zoals Latin-1. Die bevatten niet alle Unicode karakters. Sterker nog, die bevatten normaal gesproken maar zo'n 0,3% van alle karakters.

Met enige ervaring kun je standaard problemen herkennen. Als je een string hebt zoals YottaBrain - twee keer zoveel karakters als je verwacht, en de oneven karakters zijn A met diacriet - dan is het probleem eigenlijk al bekend. Je hebt een string met UTF-8 ge-encoded, maar je geeft 'm weer alsof het Latin-1 is. Dit kan overigens schijn zijn: de Visual Studio debugger doet precies dat met UTF-8 strings in geheugen. De reden is dat nergens staat vermeld dat het een UTF-8 of Latin-1 string is, en Visual Studio neemt dan aan dat het Latin-1 is (beter gezegd, CP-1252, de standaard character set op Amerikaanse en Nederlandse Windows versies)

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


Acties:
  • 0 Henk 'm!

  • joppybt
  • Registratie: December 2002
  • Laatst online: 21:21
Lees ook eens dit zeer leerzame artikel op joelonsoftware:
The Single Most Important Fact About Encodings

If you completely forget everything I just explained, please remember one extremely important fact. It does not make sense to have a string without knowing what encoding it uses. You can no longer stick your head in the sand and pretend that "plain" text is ASCII