/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Tegnsæt
Fra : Jacob Jensen


Dato : 24-08-05 10:27

Hej

Hvordan fungerer sådan noget med tegnsæt egentligt? Hvis jeg i c++ skriver:

MessageBox(0, "æøå", "status", MB_OK);

....så vises æøå på skærmen som det skal. Hvordan vælger oversætteren hvad
"æøå" skal oversættes til?

Som skrevet i en anden tråd er jeg ved at lave et lille program hvor jeg
modtager headere fra usenet. De kommer nogle gange til at se ud som det her:

=?iso-8859-1?Q?Re:_PDF_bliver_til_Winmail.dat_-_HJ=C6LP?= "Peder Vendelbo
Mikkelsen" <pedervm@myrealbox.com>

(Her er der tale om noget fra en header fra dk.edb.sikkerhed jeg har
modtaget via en TCP-socket lavet med winsock). Hvorfor vises dette ikke
korrekt i min edit-kontrol?

Jacob



 
 
Jacob Jensen (24-08-2005)
Kommentar
Fra : Jacob Jensen


Dato : 24-08-05 10:30

> =?iso-8859-1?Q?Re:_PDF_bliver_til_Winmail.dat_-_HJ=C6LP?= "Peder Vendelbo
> Mikkelsen" <pedervm@myrealbox.com>
>
> (Her er der tale om noget fra en header fra dk.edb.sikkerhed jeg har
> modtaget via en TCP-socket lavet med winsock). Hvorfor vises dette ikke
> korrekt i min edit-kontrol?

Det viser sig at jeg godt manuelt kan skrive æøå i min edit kontrol ved
f.eks. at skrive:

SetDlgItemText(hwndDlg, IDC_TEXTAREA, "æøå");

....hvor IDC_TESTAREA er min edit-kontrol. Det er åbenbart det jeg modtager
fra news-serveren der volder problemer. Jeg er lidt grøn på det område :)

Jacob



Bertel Lund Hansen (24-08-2005)
Kommentar
Fra : Bertel Lund Hansen


Dato : 24-08-05 10:40

Jacob Jensen skrev:

> Som skrevet i en anden tråd er jeg ved at lave et lille program hvor jeg
> modtager headere fra usenet. De kommer nogle gange til at se ud som det her:

> =?iso-8859-1?Q?Re:_PDF_bliver_til_Winmail.dat_-_HJ=C6LP?= "Peder Vendelbo
> Mikkelsen" <pedervm@myrealbox.com>

> (Her er der tale om noget fra en header fra dk.edb.sikkerhed jeg har
> modtaget via en TCP-socket lavet med winsock). Hvorfor vises dette ikke
> korrekt i min edit-kontrol?

Det gør de også. Nogle koder overskrifterne med Quoted Printable
(det er faktisk korrekt efter RFC'erne at gøre det), og det ser
sådan ud når det vises råt.

Princuippet er at en kode indledes med = og derefter følger en
tocifret hexkode. Når man ved det, tager det ikke så lang tid at
lave en omsætter fra QP til normale tegn der kan håndtere det
vigtigste. Hvis man skal have alle accenttegn og den slags med,
bliver det lidt mere omfattende.

Jeg ved ikke om der er indbyggede rutiner nogen steder til at
gøre det.

--
Bertel
http://bertel.lundhansen.dk/   http://fiduso.dk/

Jacob Jensen (24-08-2005)
Kommentar
Fra : Jacob Jensen


Dato : 24-08-05 11:25

> Det gør de også. Nogle koder overskrifterne med Quoted Printable
> (det er faktisk korrekt efter RFC'erne at gøre det), og det ser
> sådan ud når det vises råt.

Ifølge RFC2045 ser jeg ikke noget om at strengen skal starte med
=?iso-8859-1

Er det en standard som man kan regne med eller kan man godt komme ud for at
den blot starter med "?Q?" ?

> Jeg ved ikke om der er indbyggede rutiner nogen steder til at
> gøre det.

Jeg kan umiddelbart kun finde noget i MS ATL. Det ved jeg ikke engang hvad
er :)

Jacob



Bertel Lund Hansen (24-08-2005)
Kommentar
Fra : Bertel Lund Hansen


Dato : 24-08-05 12:00

Jacob Jensen skrev:

> Er det en standard som man kan regne med eller kan man godt komme ud for at
> den blot starter med "?Q?" ?

Jeg tror man kan regne med den, men jeg ved det ikke. I mit
(hedengangne) statistikprogram oversatte jeg de seks danske
bogstaver ud fra det beskrevne princip, og det virkede.

--
Bertel
http://bertel.lundhansen.dk/   http://fiduso.dk/

Jacob Jensen (24-08-2005)
Kommentar
Fra : Jacob Jensen


Dato : 24-08-05 12:27

> Jeg tror man kan regne med den, men jeg ved det ikke. I mit
> (hedengangne) statistikprogram oversatte jeg de seks danske
> bogstaver ud fra det beskrevne princip, og det virkede.

Jeg har også lige lavet en lille funktion til æ, ø, å, Æ, Ø, Å.

Jeg tjekker først om strengen starter med "=?iso-8859-1".

Hvis den gør så løber jeg igennem og leder efter "=" og hvis der herefter er
en af de 6 hexadecimale værdier omsætter jeg. Jeg bliver ved indtil jeg
rammer "?=" og så stopper jeg. Jeg RFC'en siger intet om disse start og
slut-værdier.

Jacob



Jacob Jensen (24-08-2005)
Kommentar
Fra : Jacob Jensen


Dato : 24-08-05 14:17

> Jeg tjekker først om strengen starter med "=?iso-8859-1".

....hvilket den ikke altid gør. Det kan godt forekomme inde i strengem :)

Jacob



Jacob Jensen (24-08-2005)
Kommentar
Fra : Jacob Jensen


Dato : 24-08-05 17:46

> Jeg har også lige lavet en lille funktion til æ, ø, å, Æ, Ø, Å.
>
> Jeg tjekker først om strengen starter med "=?iso-8859-1".
>
> Hvis den gør så løber jeg igennem og leder efter "=" og hvis der herefter
> er en af de 6 hexadecimale værdier omsætter jeg. Jeg bliver ved indtil jeg
> rammer "?=" og så stopper jeg. Jeg RFC'en siger intet om disse start og
> slut-værdier.

Efter en masse hård arbejde med strenge er jeg kommet
frem til noget der ser ud til at fungere indtil videre. Jeg har dog 1
problem. Serveren sender somme tider sådan noget her:

Re: =?ISO-8859-1?Q?Triple_A-historie_t?= =?ISO-8859-1?Q?r=E6kkes_tilbage?=

Er det en standard at man sætter white space efter ?= hvis der begynder en
ny =? lige efter? I det hele taget virker det ret besynderligt. Hvorfor
afslutte en quoted printable-sektion bare for at starte den igen. Nå,
anyway.. jeg får foreløbig afkodet ovenstående til:

Re: Triple_A-historie_t rækkes_tilbage

Jeg undrer mig over alle de underscores. De er der kun nogle gange og
outook express ser ud til bare at konvertere dem til white spaces.

Når engang jeg får det her til at være lidt robust så mangler jeg jo bare
lige utf-8 og iso-8859-15 og og og... Det er håbløst :)

Jacob



Jacob Jensen (24-08-2005)
Kommentar
Fra : Jacob Jensen


Dato : 24-08-05 23:00

Bare lige en kommentar hvis nogle er begyndt at lege med det her. I skal
også tage højde for sådan noget her:

"=?ISO-8859-1?Q?=C6nder siger rap?="

Så må man endelig ikke tro at kodningen ender lige før C'et bare fordi der
står ?=.

:)

Jacob



Jacob Jensen (24-08-2005)
Kommentar
Fra : Jacob Jensen


Dato : 24-08-05 10:58

> =?iso-8859-1?Q?Re:_PDF_bliver_til_Winmail.dat_-_HJ=C6LP?= "Peder Vendelbo
> Mikkelsen" <pedervm@myrealbox.com>

Lidt google-tid fortæller mig at der er tale om noget quoted printable
encoding for at overholde protocol-kravet om 7-bit overførsel.

Nu skal jeg så bare finde en funktion som kan konvertere det til 8-bit
ascii. Jeg bruger MinGW-oversætteren. Nogle ideer?

Jacob



Martin Dyring (25-08-2005)
Kommentar
Fra : Martin Dyring


Dato : 25-08-05 05:50

"Jacob Jensen" <omo@adslhome.dk> wrote in message
news:430c44a1$0$167$edfadb0f@dtext02.news.tele.dk...
>> =?iso-8859-1?Q?Re:_PDF_bliver_til_Winmail.dat_-_HJ=C6LP?= "Peder Vendelbo
>> Mikkelsen" <pedervm@myrealbox.com>
>
> Lidt google-tid fortæller mig at der er tale om noget quoted printable
> encoding for at overholde protocol-kravet om 7-bit overførsel.
>
> Nu skal jeg så bare finde en funktion som kan konvertere det til 8-bit
> ascii. Jeg bruger MinGW-oversætteren. Nogle ideer?

Hej Jacob,

Prøv at læse RFC 2045 (http://www.faqs.org/rfcs/rfc2045.html) der beskriver
de to kodnings-former der benyttes (quoted-printable og base64) til
representation af 8-bit data.

Tag derefter en kigger på RFC 2047 (http://www.faqs.org/rfcs/rfc2047.html)
der beskriver hvordan quoted-printable/base64 benyttes i mail header felter
(eks. subject, to/from).

Lad os sige at du vil vise en popup med af
"=?iso-8859-1?Q?Re:_PDF_bliver_til_Winmail.dat_-_HJ=C6LP?= " som du læser
fra subject feltet i en mail header:

1) Du parser de 3 dele af dit "encoded-word" (jfr. RFC 2074) og opdager det
er kodet i quoted-printable (Q) og representerer tegn i ISO-8859-1
tegnsættet
2) Du dekoder alle escapede tegn (=C6 bliver til æ)
3) Du konverterer din nu 8-bit streng fra ISO-8859-1 til Unicode vha.
MultiByteToWideChar

Punkt 3 foretager du ved at slå op i
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/intl/unicode_81rn.asp
for at finde ud af hvilken codepage du skal give som parameter (ISO-8859-1
svarer til codepage 28591).

Formålet med at konvertere din streng til Unicode er at sikre at din Windows
applikation kan vises teksten rigtigt, uanset hvilket tegnsæt strengen
originalt var gemt som.

Og til sidst punkt 4) Du viser strengen med eks. MessageBoxW.

Mvh,
Martin Dyring



Jacob Jensen (25-08-2005)
Kommentar
Fra : Jacob Jensen


Dato : 25-08-05 09:47

> Prøv at læse RFC 2045 (http://www.faqs.org/rfcs/rfc2045.html) der
> beskriver de to kodnings-former der benyttes (quoted-printable og base64)
> til representation af 8-bit data.

Jeg har læst den.

> Tag derefter en kigger på RFC 2047 (http://www.faqs.org/rfcs/rfc2047.html)
> der beskriver hvordan quoted-printable/base64 benyttes i mail header
> felter (eks. subject, to/from).

Den kendte jeg ikke.

> Lad os sige at du vil vise en popup med af
> "=?iso-8859-1?Q?Re:_PDF_bliver_til_Winmail.dat_-_HJ=C6LP?= " som du læser
> fra subject feltet i en mail header:

> 1) Du parser de 3 dele af dit "encoded-word" (jfr. RFC 2074) og opdager
> det er kodet i quoted-printable (Q) og representerer tegn i ISO-8859-1
> tegnsættet

ok, indtil nu har jeg bare detekteret "=?ISO-8859-1?Q?", men jeg har heller
ikke læst 2047 endnu.

> 2) Du dekoder alle escapede tegn (=C6 bliver til æ)

ja

> 3) Du konverterer din nu 8-bit streng fra ISO-8859-1 til Unicode vha.
> MultiByteToWideChar

Som det er nu tilføjer jeg bare mit Æ (i det her tilfælde) til en streng og
det funger fint.

> Punkt 3 foretager du ved at slå op i
> http://msdn.microsoft.com/library/default.asp?url=/library/en-us/intl/unicode_81rn.asp
> for at finde ud af hvilken codepage du skal give som parameter (ISO-8859-1
> svarer til codepage 28591).

> Formålet med at konvertere din streng til Unicode er at sikre at din
> Windows applikation kan vises teksten rigtigt, uanset hvilket tegnsæt
> strengen originalt var gemt som.

ok, det leder mig hen til et spørgsmål jeg ikke har fået svar på endnu.
Hvordan ved oversætteren hvilket tegnsæt der skal oversættes til?

> Og til sidst punkt 4) Du viser strengen med eks. MessageBoxW.

jep

Jacob



Martin Dyring (25-08-2005)
Kommentar
Fra : Martin Dyring


Dato : 25-08-05 17:55

"Jacob Jensen" <omo@adslhome.dk> wrote in message
news:430d858f$0$168$edfadb0f@dtext02.news.tele.dk...
>> 3) Du konverterer din nu 8-bit streng fra ISO-8859-1 til Unicode vha.
>> MultiByteToWideChar
>
> Som det er nu tilføjer jeg bare mit Æ (i det her tilfælde) til en streng
> og det funger fint.

Hvilken type streng er det, std::string eller std::wstring (unicode)?

Og hvordan tilføjer du? (laver du bare en replace på =C6 -> æ, eller parser
du rent faktisk escape-sekvensen? (det første er den sikre vej til
vedligeholdelses-undergang)

>> Punkt 3 foretager du ved at slå op i
>> http://msdn.microsoft.com/library/default.asp?url=/library/en-us/intl/unicode_81rn.asp
>> for at finde ud af hvilken codepage du skal give som parameter
>> (ISO-8859-1 svarer til codepage 28591).
>
>> Formålet med at konvertere din streng til Unicode er at sikre at din
>> Windows applikation kan vises teksten rigtigt, uanset hvilket tegnsæt
>> strengen originalt var gemt som.

> ok, det leder mig hen til et spørgsmål jeg ikke har fået svar på endnu.
> Hvordan ved oversætteren hvilket tegnsæt der skal oversættes til?

Det er ikke oversætteren der står for tegnsæt-konverteringen i dette
tilfælde.

Efter du har dekodet et header felt (eller body'en) fra quoted-printable
eller base64 står du med en 8 bit tekst i en nærmere angivet tegnsæt (eks.
ISO-8859-1).
Tegnsættet kunne lige så godt være KOI8-R (Kyrillisk) eller UTF-8 (en 8 bit
kodnings form af Unicode).

Hvis du er igang med at lave et program der skal virke med forskellige
tegnsæt, er det mest hensigstmæssigt at representere den parsede tekst som
Unicode (std::wstring). Det er så her du benytter MultiByteToWideChar for at
lave konverteringen fra tegnsæt/codepage til Unicode.

Håber det giver mening..

--
Mvh,
Martin Dyring



Jacob Jensen (25-08-2005)
Kommentar
Fra : Jacob Jensen


Dato : 25-08-05 18:15

> Hvilken type streng er det, std::string eller std::wstring (unicode)?

std::string

> Og hvordan tilføjer du? (laver du bare en replace på =C6 -> æ, eller
> parser du rent faktisk escape-sekvensen? (det første er den sikre vej til
> vedligeholdelses-undergang)

Jeg leder endoded-word igennem fra start af. Jeg finder hhv. =?iso-8859-1?q?
og ?= og imellem dem kigger jeg på hvert tegn. Hvis =XX forekommer erstatter
jeg med det kodede tegn.

>> ok, det leder mig hen til et spørgsmål jeg ikke har fået svar på endnu.
>> Hvordan ved oversætteren hvilket tegnsæt der skal oversættes til?
>
> Det er ikke oversætteren der står for tegnsæt-konverteringen i dette
> tilfælde.
>
> Efter du har dekodet et header felt (eller body'en) fra quoted-printable
> eller base64 står du med en 8 bit tekst i en nærmere angivet tegnsæt (eks.
> ISO-8859-1).
> Tegnsættet kunne lige så godt være KOI8-R (Kyrillisk) eller UTF-8 (en 8
> bit kodnings form af Unicode).

Nårh ja :) Men hvornår bliver denne 8-bit streng tolket og af hvad og
hvordan tolkes den (altså hvilket tegnsæt?).

Når jeg eksempelvis skriver denne streng til en edit-kontrol, hvad er det så
der bestemmer hvordan strengen tolkes?

> Hvis du er igang med at lave et program der skal virke med forskellige
> tegnsæt, er det mest hensigstmæssigt at representere den parsede tekst som
> Unicode (std::wstring). Det er så her du benytter MultiByteToWideChar for
> at lave konverteringen fra tegnsæt/codepage til Unicode.

ok. I en edit control skal jeg kunne vise strenge kodet i iso-8859-1 og
iso-8859-15 og måske UTF-8. De kommer alle fra headere fra usenet. UTF-8
forekommer ikke så tit så den parser jeg ikke, men viser blot encoded-word.
De andre to har jeg fået til at virke for de mest almindelige tegn ("Æ",
"Ø", "Å", "æ", "ø", "å", ",", ":", "?", osv.) De to tegnsæt er jo stort set
ens så jeg satser på at der ikke forekommer så underlige tegn :) Hvis der
gør sker der ikke meget ved det. Jeg bruger blot programmet til at vise en
oversigt over nye beskeder i en bunke grupper på usenet.

> Håber det giver mening..

Jaaa, lidt :) Jeg er ikke stærk i det her :)

Jacob



Steen Brisson (27-08-2005)
Kommentar
Fra : Steen Brisson


Dato : 27-08-05 12:11

Til alt det du laver kan du nok få glæde af Unibook:
http://www.unicode.org/unibook/index.html

Jeg har i hvert fald haft stor glæde af den. Her kan du se på hvilke
pladser de forskellige tegn står på i hvert enkelt tegnsæt (tryk F5
for at vælge tegnsæt der vises).

Vær også opmærksom på at der også findes base64-kodning - de starter
=?iso-8859-1?B? (det er B'et der angiver base64).


--
=-=-=-=-=-=-=-=-=
Steen Brisson, Nørre Alslev

Jacob Jensen (25-08-2005)
Kommentar
Fra : Jacob Jensen


Dato : 25-08-05 10:27

> Tag derefter en kigger på RFC 2047 (http://www.faqs.org/rfcs/rfc2047.html)
> der beskriver hvordan quoted-printable/base64 benyttes i mail header
> felter (eks. subject, to/from).

Tak, den gav også svar på mit problem med under scores.

Jacob



Michael Rasmussen (24-08-2005)
Kommentar
Fra : Michael Rasmussen


Dato : 24-08-05 18:31

On Wed, 24 Aug 2005 11:27:01 +0200, Jacob Jensen wrote:

> Hvordan fungerer sådan noget med tegnsæt egentligt? Hvis jeg i c++
> skriver:

Har MFC ikke en klasse til at en-/decode qoute printable mv.?
--
Hilsen/Regards
Michael Rasmussen
http://keyserver.veridis.com:11371/pks/lookup?op=get&search=0xE3E80917


Jacob Jensen (24-08-2005)
Kommentar
Fra : Jacob Jensen


Dato : 24-08-05 18:34

> Har MFC ikke en klasse til at en-/decode qoute printable mv.?

Måske, men jeg bruger MinGW-oversætteren.

Jacob



Søg
Reklame
Statistik
Spørgsmål : 177577
Tips : 31968
Nyheder : 719565
Indlæg : 6409071
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste