Avatar billede dn666 Nybegynder
05. oktober 2005 - 13:46 Der er 11 kommentarer

XmlDocument og encoding

Hej..
Og så det samme evindelige problem..
XML og encodning..


Jeg får tit XML filer der i deres declaration har en en eks. encodning UTF-8. men filen er gemt som dos....
når jeg så loader XML filen er den loaded i dos. og ikke i den encoding der står i declaration'en, så de danske bogstaver går tabt.


Er der en måde jeg kan læse XmlDeclarationen fra en xml og loade XmlDocument'et med encodingen fra denne..
Avatar billede spif2001 Nybegynder
05. oktober 2005 - 13:50 #1
Er ikke så meget inde i det, men jeg bruger en anden fremgangsmåde, når der går ged i mine xml filer.

Jeg tager en xml fil der virker - altså hvor encodingen og xmltexten passer - og copy paster den ødelagte xml fil's text over i en kopi af den - skod løsning men det virker
Avatar billede Slettet bruger
05. oktober 2005 - 13:50 #2
Det er jo dybest set sådan at hvis nogen sender dig en XML file gemt i ISO-8859-1 og angiver UTF-8 i deklarationen så sender de dig noget forkert. Du kan selvfølgelig forsøge at omgå dette men tage dog hånd om det grundlæggende problem og fortæl de der sender dig noget forkert at det ikke kan bruges fordi de laver filerne forkert. Hvis de sender filer i ISO-8859-1 så kan de vel bare angive det i deklaration.
Avatar billede dn666 Nybegynder
05. oktober 2005 - 13:59 #3
Jeg er klar over de sender skod filer, men de gutter der laver dem fatter nada, og står helt af hvis jeg fortæller hvad problemet er,

Det "Hurtige hack" ville være at læse declarationen, og fortælle stream'en at den skal loade med denne encodning. men...

Jeg kan se der er en CreateXmlDeclaration metode på XmlDocument men ikke en GetXmlDeclaration.. hvordan henter man den ud ??
Avatar billede driis Nybegynder
05. oktober 2005 - 14:06 #4
Hvis dine XML filer der er gemt i UTF8 er gemt med byte ordering mark (eller UTF-8signature, som Visual Studio kalder det når man gemmer en fil), kan du kigge efter det. Hvis det findes, er det en UTF8 fil, hvis ikke kan du prøve at behandle den som ISO-8859-1

Byte ordering mark ligger i de 2 første bytes og har værdien 0xFEFF. Hvis dine UTF8 filer er gemt uden dette mærke, kan metoden dog ikke bruges. Så start med at checke med nogle af dine eksisterende UTF8 filer, om mærket er til stede.
Avatar billede driis Nybegynder
05. oktober 2005 - 14:07 #5
Det hjælper jo ikke at læse declaration og så forsøge at læse som den declaration  - hvis filen netop er gemt på en anden måde ?
Avatar billede arne_v Ekspert
05. oktober 2005 - 14:29 #6
læs hele filen, lav en analyse af filens indhold og lav et kvalificeret gæt på
tegnsæt, konverter filen fra dette tegnsæt tilde angivne i xml headeren (UTF-8)
og kør så normalt
Avatar billede dn666 Nybegynder
05. oktober 2005 - 15:45 #7
Fandt denne beskrivelse..

UCS-4 range (hex.)          UTF-8 octet sequence (binary)
  0000 0000-0000 007F  0xxxxxxx
  0000 0080-0000 07FF  110xxxxx 10xxxxxx
  0000 0800-0000 FFFF  1110xxxx 10xxxxxx 10xxxxxx

  0001 0000-001F FFFF  11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
  0020 0000-03FF FFFF  111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
  0400 0000-7FFF FFFF  1111110x 10xxxxxx ... 10xxxxxx

  Encoding from UCS-4 to UTF-8 proceeds as follows:

  1) Determine the number of octets required from the character value
      and the first column of the table above.  It is important to note
      that the rows of the table are mutually exclusive, i.e. there is
      only one valid way to encode a given UCS-4 character.

  2) Prepare the high-order bits of the octets as per the second column
      of the table.

  3) Fill in the bits marked x from the bits of the character value,
      starting from the lower-order bits of the character value and
      putting them first in the last octet of the sequence, then the
      next to last, etc. until all x bits are filled in.

      The algorithm for encoding UCS-2 (or Unicode) to UTF-8 can be
      obtained from the above, in principle, by simply extending each
      UCS-2 character with two zero-valued octets.  However, pairs of
      UCS-2 values between D800 and DFFF (surrogate pairs in Unicode
      parlance), being actually UCS-4 characters transformed through
      UTF-16, need special treatment: the UTF-16 transformation must be
      undone, yielding a UCS-4 character that is then transformed as
      above.

      Decoding from UTF-8 to UCS-4 proceeds as follows:

  1) Initialize the 4 octets of the UCS-4 character with all bits set
      to 0.

  2) Determine which bits encode the character value from the number of
      octets in the sequence and the second column of the table above
      (the bits marked x).

  3) Distribute the bits from the sequence to the UCS-4 character,
      first the lower-order bits from the last octet of the sequence and
      proceeding to the left until no x bits are left.

      If the UTF-8 sequence is no more than three octets long, decoding
      can proceed directly to UCS-2.
Avatar billede arne_v Ekspert
05. oktober 2005 - 20:21 #8
hvor kommer UCS-4 ind i billedet ?
Avatar billede dn666 Nybegynder
06. oktober 2005 - 11:12 #9
det var nu ikke så meget den.
bare
  0000 0000-0000 007F  0xxxxxxx
  0000 0080-0000 07FF  110xxxxx 10xxxxxx
  0000 0800-0000 FFFF  1110xxxx 10xxxxxx 10xxxxxx

  0001 0000-001F FFFF  11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
  0020 0000-03FF FFFF  111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
  0400 0000-7FFF FFFF  1111110x 10xxxxxx ... 10xxxxxx
Avatar billede arne_v Ekspert
19. oktober 2005 - 21:38 #10
jeg tænkte på noget a la:

using System;
using System.IO;

public class CharSetGuesser
{
    public static string Guess(string filename)
    {
        int[] freq = new int[256];
        Stream stm = new FileStream(filename, FileMode.Open, FileAccess.Read);
        int c;
        while((c = stm.ReadByte()) >= 0)
        {
            freq[c]++;
        }
        stm.Close();
        if((freq[197] + freq[198] + freq[200] +
            freq[201] + freq[203] + freq[216] +
            freq[229] + freq[230] + freq[232] +
            freq[233] + freq[235] + freq[248]) >
          (freq[133] + freq[134] + freq[136] +
            freq[137] + freq[139] + freq[152] +
            freq[165] + freq[166] + freq[168] +
            freq[169] + freq[171] + freq[184] +
            freq[195]))
        {
            return "ISO-8859-1";
        }
        else
        {
            return "UTF-8";
        }
    }
    public static void Main(string[] args)
    {
        Console.WriteLine(Guess("C:\\iso-8859-1.txt"));
        Console.WriteLine(Guess("C:\\utf-8.txt"));
    }
}
Avatar billede arne_v Ekspert
04. november 2005 - 19:41 #11
status ?
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
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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

IT-JOB