Hi,
j'aimerais arriver à une fonction qui détecte le charset d'un fichier.
Pour cela je me suis appuié de ce table :
U-00000000 – U-0000007F: 0xxxxxxx
U-00000080 – U-000007FF: 110xxxxx 10xxxxxx
U-00000800 – U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 – U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 – U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 – U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
qui décrit toutes les combinaisons d'octets possibles.
Pour le moment mon code ressemble à celui-ci :
Cela semble fonctionner. J'ai tout de même pu observer que certains caractères était incorrecte.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87 // TODO Auto-generated method stub FileReader fileToRead = new FileReader(new File("file")); Integer byteInInt; String byteInBin; Integer sequenceExpected = 0; // Sequence encore attendues qui commencent par 10 boolean rater = false; while((byteInInt = fileToRead.read()) != -1) { byteInBin = Integer.toBinaryString(byteInInt); System.out.println(byteInInt); System.out.println(byteInBin); if (byteInBin.length() == 8) { if (byteInBin.charAt(0) == '0' && sequenceExpected == 0) { } else if (byteInBin.charAt(0) == '1' && byteInBin.charAt(1) == '1' && byteInBin.charAt(2) == '0' && sequenceExpected == 0) { sequenceExpected = 1; } else if (byteInBin.charAt(0) == '1' && byteInBin.charAt(1) == '1' && byteInBin.charAt(2) == '1' && byteInBin.charAt(3) == '0' && sequenceExpected == 0) { sequenceExpected = 2; } else if (byteInBin.charAt(0) == '1' && byteInBin.charAt(1) == '1' && byteInBin.charAt(2) == '1' && byteInBin.charAt(3) == '1' && byteInBin.charAt(4) == '0' && sequenceExpected == 0) { sequenceExpected = 3; } else if (byteInBin.charAt(0) == '1' && byteInBin.charAt(1) == '1' && byteInBin.charAt(2) == '1' && byteInBin.charAt(3) == '1' && byteInBin.charAt(4) == '1' && byteInBin.charAt(5) == '0' && sequenceExpected == 0) { sequenceExpected = 4; } else if (byteInBin.charAt(0) == '1' && byteInBin.charAt(1) == '1' && byteInBin.charAt(2) == '1' && byteInBin.charAt(3) == '1' && byteInBin.charAt(4) == '1' && byteInBin.charAt(5) == '1' && byteInBin.charAt(6) == '0' && sequenceExpected == 0) { sequenceExpected = 5; } else if (byteInBin.charAt(0) == '1' && byteInBin.charAt(1) == '0') { sequenceExpected--; } else { rater = true; } } else if (byteInBin.length() > 8) { rater = true; } else if (byteInBin.length() < 8) { if (sequenceExpected != 0) { rater = true; } } if (rater) { //System.exit(0); } } if (!rater) { System.out.println("UTF-8"); } else { System.out.println("PAS UTF-8"); }
Par exemple si le fichier (sans BOM) contient juste le symbole euro : € voici ce que j'obtient :
226
11100010
8218
10000000011010
172
10101100
PAS UTF-8
J'ai pu voir que cela était le cas pour d'autres symboles.
Je ne comprends pas pourquoi la 2eme sequence contient autant de bit ...
Quelqu'un pourrait m'éclairer ?
sources : http://www.cl.cam.ac.uk/~mgk25/unicode.html
Partager