Avatar billede glacier Nybegynder
17. juni 2009 - 16:20 Der er 4 kommentarer og
1 løsning

Tjekke Text encoding

Hej

Jeg har et problem jeg håber i kan hjælpe med.

Jeg har et VB program som læser nogle tekstfiler/csv filer og smider dataene fra disse ind i en database.
Problemet ligger i at det er forskelligt hvilken text-encoding filerne er lavet i.
Nogle af filerne er lavet i UTF-8, andre i ASCII.
Jeg bruger StreamReader til at læse filerne med, og da jeg somsagt ikke ved hvilken encoding filerne er i har jeg problemer med æøå osv.

Er der nogen som har en god ide hvordan jeg enten kan finde udaf hvilken encoding filerne har eller evt. hvordan jeg kan læse filer med forskellig encoding ind uden at få problemer med æøå.

Mvh
Glacier
Avatar billede arne_v Ekspert
17. juni 2009 - 16:28 #1
Dit problem er principielt uloeseligt. Der kan godt eksistere en byte sekvens som er valid i 2 forskellige encodings bare med forskellig tekst.

Hvis du ved at sproget er dansk kan du lave et kvalificeret gaet udfra filens indhold.

Eksempel i C#:

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
17. juni 2009 - 22:06 #2
Oversat til VB.NET:

Imports System
Imports System.IO

Public Class CharSetGuesser
    Public Shared Function Guess(filename As String) As String
        Dim freq As Integer() = New Integer(255) {}
        Dim stm As Stream = New FileStream(filename, FileMode.Open, FileAccess.Read)
        Dim c As Integer
        While (c = stm.ReadByte()) >= 0
            freq(c) += 1
        End While
        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)) Then
            Return "ISO-8859-1"
        Else
            Return "UTF-8"
        End If
    End Function
    Public Shared Sub Main(args As String())
        Console.WriteLine(Guess("C:\iso-8859-1.txt"))
        Console.WriteLine(Guess("C:\utf-8.txt"))
    End Sub
End Class
Avatar billede glacier Nybegynder
18. juni 2009 - 09:14 #3
Tak skal du have. Smider du lige et svar?
Avatar billede arne_v Ekspert
18. juni 2009 - 09:34 #4
Kommer her.
Avatar billede arne_v Ekspert
04. august 2009 - 03:42 #5
Saa mangler du bare at acceptere svaret.
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
Kurser inden for grundlæggende programmering

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