|
| 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 (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
| |
|
|