Avatar billede nielsbrinch Nybegynder
01. september 2005 - 14:15 Der er 14 kommentarer og
1 løsning

Konvertering af tegnsæt fra Latin-1 til UTF-8

Min bruger indtaster oplysninger i en formular i ISO-8859-1 (Latin1). Disse oplysninger sendes direkte til en webservice som bruger UTF-8. Derfor er der ÆØÅ-problemer.

Jeg vil konvertere det brugeren har indtastet, til UTF-8. Helst med en generel tegnsæt-konverterings-metode. Nogen der kan hjælpe?
Avatar billede nielsbrinch Nybegynder
01. september 2005 - 14:32 #1
Jeg har fundet den slags på Nettet:

public static string ConvertEncoding(Encoding from, Encoding to, string text)
{
    byte[] bytes = from.GetBytes(text);
    return to.GetString(bytes);
}

Det virker selvfølgelig ikke.
Avatar billede nielsbrinch Nybegynder
01. september 2005 - 14:37 #2
Jeg har også prøvet følgende:

public static string ConvertEncoding(Encoding from, Encoding to, string text)
{
    byte[] bytes = from.GetBytes(text);
    byte[] converted = Encoding.Convert(from, to, bytes);
    return to.GetString(converted);
}

Men det har tilsyneladende heller ikke nogen egentlig effekt.
Avatar billede nielsbrinch Nybegynder
01. september 2005 - 14:46 #3
Jeg har også forsøgt at konvertere til bytes og sende disse bytes direkte:

public static byte[] ConvertEncoding(Encoding from, Encoding to, string text)
{
    byte[] bytes = from.GetBytes(text);
    return Encoding.Convert(from, to, bytes);
}

Men det er det samme som førnævnte.
Avatar billede arne_v Ekspert
01. september 2005 - 14:49 #4
hvad kommer ÆØÅ over som ? 1 eller 2 tegn ? hvilken numerisk kode ?
Avatar billede nielsbrinch Nybegynder
01. september 2005 - 14:51 #5
De bliver ædt af min .NET-webservice. Den kører i ren UTF-8 og modtager en streng.

æblegrød bliver til blegrd.
Avatar billede nielsbrinch Nybegynder
01. september 2005 - 14:52 #6
Hvis jeg lader brugeren indtaste sine oplysninger i UTF-8 virker alt som det skal.
Avatar billede arne_v Ekspert
01. september 2005 - 15:16 #7
så har du jo ikke mulighed for at konvertere dem tilbage når de er helt væk

jeg formoder at der er gode grunde til at den formular kører i ISO-8859-1

men hvad fortæller web service client web service server om karakter sæt ?

ingenting ? korrekt ISO-8859-1 ? forkert UTF-8 ?
Avatar billede nielsbrinch Nybegynder
01. september 2005 - 15:22 #8
Webservicen får UTF-8 at vide og modtager i ISO-88569-1

Bruger indtaster i ISO-8859-1

Umiddelbart efter vil jeg konvertere det indtastede til UTF-8, så det kan sendes ubesværet med webservicen. Jeg vil altså foretage konverteringen i min webservice client.

Min client fortæller webservicen at indholdet er UTF-8. Og det virker også når indholdet rent faktisk er UTF-8.
Avatar billede arne_v Ekspert
01. september 2005 - 15:33 #9
Så det du reelt har brug for er et filter som modtager den rene HTTP request
med SOAP XML og enten kan ændre charset label eller indhold til at være
det rigtige charset inden den parses af .NET framework koden (som så smider
de illegale UTF-8 tegn helt væk) ?
Avatar billede nielsbrinch Nybegynder
01. september 2005 - 15:36 #10
Nej. I den applikation hvor brugeren indtaster sine oplysninger, har jeg de rigtige oplysninger tilgængelige - de eksisterer bare kun i et forkert tegnsæt. Jeg vil konvertere dem til det rigtige tegnsæt inden jeg overhovedet begynder at tænke på at de skal sendes videre til en webservice.
Avatar billede arne_v Ekspert
01. september 2005 - 15:48 #11
OK - i web service client

har du mulighed for at capture det som bliver sendt (HTTP header og SOAP XML) ?
Avatar billede nielsbrinch Nybegynder
01. september 2005 - 15:53 #12
Ja, jeg kan fange hvad jeg sender til webservice:

POST /webservices/test.asmx HTTP/1.0
Host: domain.dk
Content-Type: text/xml; charset=utf-8
Content-Length: 389
SOAPAction: "http://www.domain.dk/Test/TestDanishCharacters"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <TestDanishCharacters xmlns="http://www.domain.dk/Test/">
      <input>blegrd</input>
    </TestDanishCharacters>
  </soap:Body>
</soap:Envelope>

Den sender ikke æblegrød med, fordi den sender i UTF8 men indholdet er faktisk i ISO-8859-1
Avatar billede nielsbrinch Nybegynder
02. september 2005 - 11:16 #13
Pinligt.

Måske virker et af mine eksempler øverst. Måske virker alle tre. Jeg indså ikke at tegnsæt-fejlen opstod et andet sted i programmet. Jeg var ikke opmærksom på forskellen på "escape", "encodeURI" og "encodeURIComponent" i JavaScript.

Tak for din opmærksomhed arne. Læg gerne et svar.
Avatar billede arne_v Ekspert
02. september 2005 - 21:08 #14
OK

men jeg synes nu ikke at jeg har bidraget med meget
Avatar billede nielsbrinch Nybegynder
06. september 2005 - 13:25 #15
Jeg har taget fejl af hvordan strenge virker i .NET. Derfor var jeg skrupforvirret. Jeg vil lige kort beskrive det, til hvis andre skulle dumpe forbi dette spørgsmål.

En streng i .NET er _altid_ Unicode. Hvis du henter noget iso-8859-1 tekst ind i din applikation bliver det til Unicode. Hvis du skriver noget iso-8859-1 tekst fra din applikation til en fil, bliver det konverteret fra unicode til iso-8859-1.

Unicode er altså tegnsættet der binder alle de andre tegnsæt sammen. Og .NET benytter som sagt altid Unicode internt, uanset om du skriver andet i Web.config, Machine.config eller andet.

Du kan konvertere din streng til et UTF8-byte-array, f.eks. hvis du gerne vil skrive til en fil med UTF-8. Men hvis du konverterer dit UTF8-array tilbage til en streng, bliver den til Unicode igen.

Kloge hoveder må meget gerne rette mig hvis jeg tager fejl.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester