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

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Hvordan klarer man chr(x) med x > 256 (?)
Fra : Mads Aggerholm


Dato : 10-09-09 19:32

God dag,

Jeg sidder laver en applikation i C#, som gennem en webrequest opdaterer en
tabel på min webside.

For at undgå bøvl med æøå og plinger og så videre, konverterer jeg teksten
til ASCII-kode inden selve kaldet, og konverterer den tilbage igen i min
PHP-kode inden jeg lægger den ned i tabellen.

Når jeg skal læse data er det bare den anden vej.

Det fungerede fortrinligt, indtil jeg stødte på et navn med "C". C omsættes
til ASCII 268 i C# (det kan den fint håndtere), men på PHP-siden bliver
chr(268) lavet om til chr(12) - åbenbart fordi 268 - 256 = 12, og 256 er
max!

Er der en måde man kan gøre det på? Kan PHP bringes til at acceptere
ASCII-koder større end 256??

Venlig hilsen
Mads Aggerholm


 
 
Mads Aggerholm (10-09-2009)
Kommentar
Fra : Mads Aggerholm


Dato : 10-09-09 20:13

> Det fungerede fortrinligt, indtil jeg stødte på et navn med "C". C
> omsættes til ASCII 268 i C# (det kan den fint håndtere), men på PHP-siden
> bliver chr(268) lavet om til chr(12) - åbenbart fordi 268 - 256 = 12, og
> 256 er max!

Nå! Nu kan jeg se, at det "C" jeg taler om er blevet lavet om til et
almindeligt C i mit indlæg.
Lad mig lige forklare, at der er tale om et C med sådan en lille hårsløjfe
oven på. Det bruges i Tjekkoslovakiet, og kan ses på denne side omhandlende
forfatteren Karel Capek.

Venlig hilsen
Mads Aggerholm



Bertel Lund Hansen (10-09-2009)
Kommentar
Fra : Bertel Lund Hansen


Dato : 10-09-09 21:28

Mads Aggerholm skrev:

> Lad mig lige forklare, at der er tale om et C med sådan en lille hårsløjfe
> oven på. Det bruges i Tjekkoslovakiet, og kan ses på denne side omhandlende
> forfatteren Karel Capek.

Du skal have fat i noget med UTF-8 hvis du skal håndtere tegn
over kode 256.

Det er ikke nok at erklære UTF.-8 i HTML-sidens tegnerklæring.
Serveren skal også sættes op til at servere det - og siderne skal
kodes med en editor der kan benytte det.

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

Martin (10-09-2009)
Kommentar
Fra : Martin


Dato : 10-09-09 21:51

Bertel Lund Hansen wrote:
> Mads Aggerholm skrev:
>
>> Lad mig lige forklare, at der er tale om et C med sådan en lille hårsløjfe
>> oven på. Det bruges i Tjekkoslovakiet, og kan ses på denne side omhandlende
>> forfatteren Karel Capek.
>
> Du skal have fat i noget med UTF-8 hvis du skal håndtere tegn
> over kode 256.
>
> Det er ikke nok at erklære UTF.-8 i HTML-sidens tegnerklæring.
> Serveren skal også sættes op til at servere det - og siderne skal
> kodes med en editor der kan benytte det.
>

<?php
header('content-type: text/html; charset=utf-8');

også husk at gemme dine filer som UTF-8 (her kan notepad vistnok ikke
være med, brug fx. intype)

Stig Johansen (11-09-2009)
Kommentar
Fra : Stig Johansen


Dato : 11-09-09 13:29

Martin wrote:

> også husk at gemme dine filer som UTF-8 (her kan notepad vistnok ikke
> være med, brug fx. intype)

Nåh - interessant, min notepad, som fulgte med min Win2K pro kan da gemme
både som Ansi,Utf-8 samt UTF-16 - little og big endian.

Hvilken notepad bruger du?

Bortset fra det, så handler det om _unicode_ (codepoint > 127, alternativt
> 255), hvor UTF-8 kun er en af mange encoding schemes.

Selvfølgelig hvis man ikke kan 'nøjes' med iso-8859-1 eller andet single
byte charset.

--
Med venlig hilsen
Stig Johansen

Philip Nunnegaard (11-09-2009)
Kommentar
Fra : Philip Nunnegaard


Dato : 11-09-09 15:35

Stig Johansen skrev:

> Nåh - interessant, min notepad, som fulgte med min Win2K pro kan da gemme
> både som Ansi,Utf-8 samt UTF-16 - little og big endian.

Min Notepad har samme 4 muligheder som du lister op.
Jeg har Vista.

--
Philip - http://chartbase.dk | http://www.hitsurf.dk

Martin (11-09-2009)
Kommentar
Fra : Martin


Dato : 11-09-09 18:21

Stig Johansen wrote:
> Martin wrote:
>
>> også husk at gemme dine filer som UTF-8 (her kan notepad vistnok ikke
>> være med, brug fx. intype)
>
> Nåh - interessant, min notepad, som fulgte med min Win2K pro kan da gemme
> både som Ansi,Utf-8 samt UTF-16 - little og big endian.
>
> Hvilken notepad bruger du?

Hmm... så er det sku nok bare mig der ikke bruger den nok høhø - det er
jeg sku ked af at have sagt så :)

notepad.exe eksisterer slet ikke hos mig mere, den er kylet ud :D

>
> Bortset fra det, så handler det om _unicode_ (codepoint > 127, alternativt
>> 255), hvor UTF-8 kun er en af mange encoding schemes.
>
> Selvfølgelig hvis man ikke kan 'nøjes' med iso-8859-1 eller andet single
> byte charset.
>

Hvad er egentlig det mest korrekte tegnsæt at bruge?
- Ved enkelt sproget (dansk) ?
- Ved flersproget (dansk, svensk og tysk fx) ?

Bertel Lund Hansen (11-09-2009)
Kommentar
Fra : Bertel Lund Hansen


Dato : 11-09-09 18:24

Martin skrev:

> Hvad er egentlig det mest korrekte tegnsæt at bruge?

Et der omfatter de tegn man har brug for.

> - Ved enkelt sproget (dansk) ?
> - Ved flersproget (dansk, svensk og tysk fx) ?

Alle nævnte kan skrives med ISO-8859-1.

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

Martin (11-09-2009)
Kommentar
Fra : Martin


Dato : 11-09-09 18:37

Bertel Lund Hansen wrote:
> Martin skrev:
>
>> Hvad er egentlig det mest korrekte tegnsæt at bruge?
>
> Et der omfatter de tegn man har brug for.
>
>> - Ved enkelt sproget (dansk) ?
>> - Ved flersproget (dansk, svensk og tysk fx) ?
>
> Alle nævnte kan skrives med ISO-8859-1.
>

Dvs vi skal lidt mere syd på grækenland fx. før et andet tegnsæt er
nødvendigt?

Bertel Lund Hansen (11-09-2009)
Kommentar
Fra : Bertel Lund Hansen


Dato : 11-09-09 20:26

Martin skrev:

> Dvs vi skal lidt mere syd på grækenland fx. før et andet tegnsæt er
> nødvendigt?

F.eks. græsk, russisk og arabisk kan ikke skrives med latinske
bogstaver for slet ikke at tale om kinesisk og japansk.

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

Stig Johansen (12-09-2009)
Kommentar
Fra : Stig Johansen


Dato : 12-09-09 01:39

Martin wrote:

> Bertel Lund Hansen wrote:
>> Martin skrev:
>>
>>> Hvad er egentlig det mest korrekte tegnsæt at bruge?
>>
>> Et der omfatter de tegn man har brug for.
>>
>>> - Ved enkelt sproget (dansk) ?
>>> - Ved flersproget (dansk, svensk og tysk fx) ?
>>
>> Alle nævnte kan skrives med ISO-8859-1.
>>
>
> Dvs vi skal lidt mere syd på grækenland fx. før et andet tegnsæt er
> nødvendigt?

I forbindelse med en anden diskussion lavede jeg et lille testprogram, der
udskriver alle 'tegn' fra 1 til 255.
<http://w-o-p-r.dk/test/iso.win.chars.asp?charset=windows-1252>
Data bliver serveret uden angivelse af charset, så øvelsen gik ud på at se
om data blev vist forskelligt afhængig af <meta> tagget.

Men i stedet for at sige 'mere sydpå', kan man sige, at hvis du har brug for
tegn, der ikke vises, så er det utf-8.

Ok, der er også andre codepages til single byte tegnsæt, men dem tror jeg
ikke er relevante i DK.

--
Med venlig hilsen
Stig Johansen

Mads Aggerholm (11-09-2009)
Kommentar
Fra : Mads Aggerholm


Dato : 11-09-09 19:12

>>
>> Du skal have fat i noget med UTF-8 hvis du skal håndtere tegn
>> over kode 256.
>>
>> Det er ikke nok at erklære UTF.-8 i HTML-sidens tegnerklæring.
>> Serveren skal også sættes op til at servere det - og siderne skal
>> kodes med en editor der kan benytte det.
>>
>
> <?php
> header('content-type: text/html; charset=utf-8');
>
> også husk at gemme dine filer som UTF-8 (her kan notepad vistnok ikke
> være med, brug fx. intype)

Jeg forstår ikke helt: "siderne skal kodes med en editor der kan benytte
det"

Jeg gemmer mine "sider" som .txt, og jeg kan se i notesblok står der ANSI
som default.
Hvad hjælper det at gemme dem som UTF-8?? Det er jo i princippet bare en
række kommandoer?

Når man bruger kommandoen "chr(268)" bliver resultatet så forskelligt
afhængig af om selve scriptet er gemt som UTF-8 eller ej?


Martin (11-09-2009)
Kommentar
Fra : Martin


Dato : 11-09-09 19:21

Mads Aggerholm wrote:
>>>
>>> Du skal have fat i noget med UTF-8 hvis du skal håndtere tegn
>>> over kode 256.
>>>
>>> Det er ikke nok at erklære UTF.-8 i HTML-sidens tegnerklæring.
>>> Serveren skal også sættes op til at servere det - og siderne skal
>>> kodes med en editor der kan benytte det.
>>>
>>
>> <?php
>> header('content-type: text/html; charset=utf-8');
>>
>> også husk at gemme dine filer som UTF-8 (her kan notepad vistnok ikke
>> være med, brug fx. intype)
>
> Jeg forstår ikke helt: "siderne skal kodes med en editor der kan benytte
> det"
>
> Jeg gemmer mine "sider" som .txt, og jeg kan se i notesblok står der
> ANSI som default.
> Hvad hjælper det at gemme dem som UTF-8?? Det er jo i princippet bare en
> række kommandoer?
>
> Når man bruger kommandoen "chr(268)" bliver resultatet så forskelligt
> afhængig af om selve scriptet er gemt som UTF-8 eller ej?

Bertels svar 10-09-2009 22:50 siger det perfekt...

-Citat-
Du skal have fat i noget med UTF-8 hvis du skal håndtere tegn
over kode 256.

Det er ikke nok at erklære UTF.-8 i HTML-sidens tegnerklæring.
Serveren skal også sættes op til at servere det - og siderne skal
kodes med en editor der kan benytte det.
-Citat slut-

Mads Aggerholm (11-09-2009)
Kommentar
Fra : Mads Aggerholm


Dato : 11-09-09 20:08

>
> Bertels svar 10-09-2009 22:50 siger det perfekt...
>
> -Citat-
> Du skal have fat i noget med UTF-8 hvis du skal håndtere tegn
> over kode 256.
>
> Det er ikke nok at erklære UTF.-8 i HTML-sidens tegnerklæring.
> Serveren skal også sættes op til at servere det - og siderne skal
> kodes med en editor der kan benytte det.
> -Citat slut-

Det med serveren kan jeg forstå.

Men "Siderne skal kodes med en editor der kan benytte det" er altså sort for
mig.
Jeg kan forstå, hvis planen var, at det dér "C-med-sløjfe-på" skulle skrives
direkte i koden - hardkodes, så at sige.
Når man så gemmer det som alm. txt, ville det måske omskrives til et
almindeligt "C", ligesom når jeg sender dette her indlæg afsted.
Men det er der jo ikke tale om. Både "C-med-sløjfe" og ASCII-værdier er jo
bare indhold i variabler. Om koden er gemt som det ene eller det andet burde
være ligegyldigt(?)


Bertel Lund Hansen (11-09-2009)
Kommentar
Fra : Bertel Lund Hansen


Dato : 11-09-09 20:33

Mads Aggerholm skrev:

> Jeg forstår ikke helt: "siderne skal kodes med en editor der kan benytte
> det"

ASCII omfatter kun koder op til og med 127. ISO-8859-1 omfatter
ASCII, men definerer derudover også koderne mellem 160 og 255.
Derved bliver der plads til bl.a. æ, ø og å. Alle disse tegn kan
rummes i én byte.

UTF-8 er identisk med ASCII på de første 127 tegn, men tegn efter
kode 127 fylder i UTF-8 to byte. Hvis din editor kun bruger én
byte til dem, er det ikke korrekt UTF-8, og så vil tegnene ikke
blive vist korrekt hvis det er det tegnsæt der forventes.

> Jeg gemmer mine "sider" som .txt, og jeg kan se i notesblok står der ANSI
> som default.
> Hvad hjælper det at gemme dem som UTF-8?? Det er jo i princippet bare en
> række kommandoer?

Det hjælper ikke noget at læse en doc-fil i et regneark selv om
det blot er en stribe bytes. Alle filer er jo 'bare' bytes, men
det betyder ikke at de kan tolkes korrekt af et vilkårligt
program.

> Når man bruger kommandoen "chr(268)" bliver resultatet så forskelligt
> afhængig af om selve scriptet er gemt som UTF-8 eller ej?

Ja.

Tegnene gemmes kun som koder - ikke som kommandoer.

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

Martin (11-09-2009)
Kommentar
Fra : Martin


Dato : 11-09-09 21:09

Bertel Lund Hansen wrote:
> Mads Aggerholm skrev:
>
>> Jeg forstår ikke helt: "siderne skal kodes med en editor der kan benytte
>> det"
>
> ASCII omfatter kun koder op til og med 127. ISO-8859-1 omfatter
> ASCII, men definerer derudover også koderne mellem 160 og 255.
> Derved bliver der plads til bl.a. æ, ø og å. Alle disse tegn kan
> rummes i én byte.
>
> UTF-8 er identisk med ASCII på de første 127 tegn, men tegn efter
> kode 127 fylder i UTF-8 to byte. Hvis din editor kun bruger én
> byte til dem, er det ikke korrekt UTF-8, og så vil tegnene ikke
> blive vist korrekt hvis det er det tegnsæt der forventes.
>
>> Jeg gemmer mine "sider" som .txt, og jeg kan se i notesblok står der ANSI
>> som default.
>> Hvad hjælper det at gemme dem som UTF-8?? Det er jo i princippet bare en
>> række kommandoer?
>
> Det hjælper ikke noget at læse en doc-fil i et regneark selv om
> det blot er en stribe bytes. Alle filer er jo 'bare' bytes, men
> det betyder ikke at de kan tolkes korrekt af et vilkårligt
> program.
>
>> Når man bruger kommandoen "chr(268)" bliver resultatet så forskelligt
>> afhængig af om selve scriptet er gemt som UTF-8 eller ej?
>
> Ja.
>
> Tegnene gemmes kun som koder - ikke som kommandoer.
>

Tak for udredningen, selv nu forstår jeg hvad de forskellige er
Utroligt at man har arbejdet med webudvikling i flere år uden at vide
hvad det egentlig med sikkerhed betød hehe.

og synes lige at wikipediaen var lidt for uoverskulig.

PS
Bertel, du burde smide dit svar ind i den danske wikipedia

Stig Johansen (12-09-2009)
Kommentar
Fra : Stig Johansen


Dato : 12-09-09 01:32

Bertel Lund Hansen wrote:

> UTF-8 er identisk med ASCII på de første 127 tegn, men tegn efter
> kode 127 fylder i UTF-8 to byte.

Lidt flue**, men tegn over 127 fylder _mindst_ to bytes.
Jeg kan ikke lige huske hvor mange, men det er op til 6-8 bytes.

> Hvis din editor kun bruger én
> byte til dem, er det ikke korrekt UTF-8, og så vil tegnene ikke
> blive vist korrekt hvis det er det tegnsæt der forventes.

Derudover er det lidt specielt formatteret, da den første byte er en slags
index til den næste byte, så der er særlige krav til formatteringen.

ANSI/ISO benytter %C2 til de første 64 tegn (over 127), og %C3 til de næste
64 tegn.

I forbindelse med noget Ajax, har jeg lavet denne her javascript funktion,
der sørger for at sende 'wire data' som Ansi/Iso, så man slipper for at
konvertere serverside:
<http://w-o-p-r.dk/javascript/UTF8toAnsi.js>

Ud fra koden kan man se lidt om hvordan strukturen er i utf-8.

--
Med venlig hilsen
Stig Johansen

Mads Aggerholm (12-09-2009)
Kommentar
Fra : Mads Aggerholm


Dato : 12-09-09 07:41

>>
>>> Lad mig lige forklare, at der er tale om et C med sådan en lille
>>> hårsløjfe
>>> oven på. Det bruges i Tjekkoslovakiet, og kan ses på denne side
>>> omhandlende
>>> forfatteren Karel Capek.
>>
>> Du skal have fat i noget med UTF-8 hvis du skal håndtere tegn
>> over kode 256.
>>
>> Det er ikke nok at erklære UTF.-8 i HTML-sidens tegnerklæring.
>> Serveren skal også sættes op til at servere det - og siderne skal
>> kodes med en editor der kan benytte det.
>>
>
> <?php
> header('content-type: text/html; charset=utf-8');
>
> også husk at gemme dine filer som UTF-8 (her kan notepad vistnok ikke
> være med, brug fx. intype)

Hej Martin,

Tak for dit svar.

Desværre ser det ikke ud til at fungere.

Jeg har lavet en lille test:

<?php

   header('content-type: text/html; charset=utf-8');

   echo "VER 2.20 UTF-8<br>";
   for ($i = 0; $i < 300; $i++)
   {
      $wrk = chr($i);
      echo " ".$i." til text: ".$wrk." og tilbage igen:
".ord($wrk)."<br>";
   }

?>

Og gemt den som UTF-8 (med notesblok som editor)

Når den når til 256 begynder den forfra med chr(0).

Er der andet der skal tages højde for? Jeg bemærker din sentens: "Serveren
skal også sættes op til at servere det " - det kunne man tro at den ikke er,
men det er jo ikke noget jeg er herre over(?)

Venlig hilsen

Mads Aggerholm


Stig Johansen (12-09-2009)
Kommentar
Fra : Stig Johansen


Dato : 12-09-09 10:37

Mads Aggerholm wrote:

> Når den når til 256 begynder den forfra med chr(0).
>
> Er der andet der skal tages højde for? Jeg bemærker din sentens: "Serveren
> skal også sættes op til at servere det " - det kunne man tro at den ikke
> er, men det er jo ikke noget jeg er herre over(?)

Nu er det godt nok Martin, du spørger, men du er ude i noget rod.

Enkelt byte tegnsæt kan repræsenteres med værdierne 0-255.

Unicode værdier repræsenteres med 'codepoints', som ikke nødvendigvis har
noget at gøre med 'byte værdien'.

Så at definere en chr(266) er udefineret, med mindre det er unicode.

Hvis chr(266) er unicode, så afhænger context af hvilket encoding scheme der
er brugt (UTF-8,UTF-16,UCS-2,UCS-4 - samt tilhørende little eller big
endian).

Unicode er tiltænkt at skulle indeholde samtlige kombinationer af
codepoints/glyphs, men der er nogle begrænsninger i de forskellige encoding
schemes.

UCS-2, f. eks., som MS startede med at bruge internt i Win95 æraen, er
begrænset til 65536 code points. De har så senere skiftet over til UTF-16,
som også er variabel længde, men indeholder SVJH 1mio + en slat 'tegn'.

Unicode har 'plads nok', og rygterne vil vide, at selv Klingon[1] har fået
reserveret codepoints.

Nu er vi nok ovre i noget upraktisk, men jeg lavede på et tidspunkt en
mapping mellem 'Jordisk sprog' og 'Klingon':
<http://w-o-p-r.dk/wopr.toys/klingon.alphabet.asp>

Det er ikke seriøst, kun 'just for fun'

[1] Dem der kender Startrek.

--
Med venlig hilsen
Stig Johansen

Stig Johansen (12-09-2009)
Kommentar
Fra : Stig Johansen


Dato : 12-09-09 11:14

Stig Johansen wrote:

[snip unicode]

Og selvfølgelig glemte jeg at sende links, men her er et par:
<http://en.wikipedia.org/wiki/UTF-8>
og
<http://en.wikipedia.org/wiki/Unicode>

Ikke at jeg betragter wikipedia som autorativ kilde, men de beskriver det
ret godt.

--
Med venlig hilsen
Stig Johansen

Stig Johansen (12-09-2009)
Kommentar
Fra : Stig Johansen


Dato : 12-09-09 11:21

Stig Johansen wrote:

> [1] Dem der kender Startrek.

Jeg har aldrig fundet ud af om det er seriøst eller ej, men:
<http://en.wikipedia.org/wiki/Klingon_writing_systems>
og angiveligt skulle codepoints:
U+F8D0 to U+F8FF
være forbeholdt Klingon.

Som sagt ved jeg ikke om det er en joke eller ej, men hvis der er 'plads
nok' i unicode, så er der vel også plads til lidt humor ;)

--
Med venlig hilsen
Stig Johansen

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

Månedens bedste
Årets bedste
Sidste års bedste