Problême d'encodage

Signaler
Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
5 mai 2014
-
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
-
Salut !

J'ai un souci d'encodage (je pense).
J'ai fais un programme qui liste des données pour plusieurs mp3 dans un fichier txt.
ex :
Titre|\\PARIS\ME\BIBLIOTHEQUE MUSICALE\Autres\Acalento.mp3
Repertoire|Autres
Genre|PS#####
Album|Jazz blues
Quand je regarde dans mon fichier txt, je remarque que le Genre de certain mp3 possède le caractère espace à sa fin (la ou il y a les ###).

Une fois ce fichier txt créé, j'ai un autre programme qui le parcours afin de compter le nombre de titres qui possède le même genre. Il liste les genres dans une colonne de datagridview, et le nombre de titres dans une autre colonne.
(Pour info, ce fichier txt est créé par un pc, et lu avec un autre. Il me permet de gérer des mp3 par leurs attribus (genre, album ...). Environ 10 000 mp3 sont listés, l'accès au fichier txt est plus rapide que l'accès réseau direct au dossier de mp3, le fichier txt est mis à jour tous les matins).

Voila mon problême :
Les espaces qui sont dans le fichier txt semblent se transformer en caractères à la con dans mon datagridview.
Problême d'encodage ??
Si oui, où ... ???

Merci d'avance pour votre aide.

Voici mes bout de code :

//J'INSTANCIE 4 TABLEAUX ET LES REMPLIT DE CETTE MANIERE
(LES TABLEAUX RESTE EN RAM)

public
void CreerTableau(
ArrayList TITRES,
ArrayList REPERTOIRES,
ArrayList GENRES,
ArrayList ALBUMS)
{

try
{

FileStream FS =
new
FileStream(
new
ConfigForm().getCheminBIBLIO() +
"/Bibliotheque.txt",
FileMode.Open);

StreamReader SR =
new
StreamReader(FS,
ASCIIEncoding.Default);

while (!SR.EndOfStream)
{

string Variable =
"";
string[] ligne;

while (!Variable.StartsWith(
"Titre"))
Variable = SR.ReadLine();
ligne = Variable.Split(
new
char[] {
'|' });
TITRES.Add(ligne[1]);

while (!Variable.StartsWith(
"Repertoire"))
Variable = SR.ReadLine();
ligne = Variable.Split(
new
char[] {
'|' });
REPERTOIRES.Add(ligne[1]);

while (!Variable.StartsWith(
"Genre"))
Variable = SR.ReadLine();
ligne = Variable.Split(
new
char[] {
'|' });
GENRES.Add(ligne[1]);

while (!Variable.StartsWith(
"Album"))
Variable = SR.ReadLine();
ligne = Variable.Split(
new
char[] {
'|' });
ALBUMS.Add(ligne[1]);
}
FS.Close(); SR.Close();
}

catch {
}
}

//AFFICHAGE D'UN GENRE A PARTIR DU TABLEAU GENRE CREE
dataTags.Rows.Insert(0, GENRES[i].ToString(),

"TOUS",
"1")

//CREE LE FICHIER TXT A PARTIR D'UN TABLEAU

public
void CreerFichierTXT()
{

ArrayList Rep =
new
ArrayList();

ArrayList NbTitres =
new
ArrayList();
getListeRepertoires(CheminBiblio, Rep, NbTitres);

int Max = 0;

for (
int i = 0; i < NbTitres.Count; i++)
Max = Max + System.
Convert.ToInt32(NbTitres[i]);

this.Invoke(
new
dConfigurerBarre(ConfigurerBarre), Max);

int NumTitre = 0;

StreamWriter TXT =
new
StreamWriter(CheminBiblio +
"/Bibliotheque.txt",
false,
ASCIIEncoding.Default);

for (
int i = 0; i < Rep.Count; i++)
{

foreach (
string S
in
Directory.GetFiles(Rep[i].ToString(),
"*.mp3", System.IO.
SearchOption.TopDirectoryOnly))
{
NumTitre++;

this.Invoke(
new
dMAJLabels(MAJLabels),
"Titre nø" + NumTitre.ToString() +
"/" + Max, S);

this.Invoke(
new
dMAJBarre(MAJBarre));
TXT.WriteLine(
"Titre|" + S);
TXT.WriteLine(
"Repertoire|" + Rep[i].ToString().Substring(CheminBiblio.Length + 1, Rep[i].ToString().Length -
CheminBiblio.Length + 1)));
TXT.WriteLine(
"Genre|" + getGenre(S));
TXT.WriteLine(
"Album|" + getAlbum(S));
}
}
TXT.Close();

this.Invoke(
new
dExit(Exit));
}

//RETOURNE LE GENRE D'UN MP3 (CHEMIN COMPLET) SOUS FORME DE STRING
public
string getGenre(
string MP3)
{

FileStream FS =
new
FileStream(MP3,
FileMode.Open);

byte[] Buffer =
new
byte[4];

int[] nb =
new
int[4];
FS.Seek(0,
SeekOrigin.Begin);
FS.Read(Buffer, 0, 3);

Encoding instEncoding =
new
ASCIIEncoding();

string filetype = instEncoding.GetString(Buffer);

string valTag;

int fs = 1;

if (filetype.StartsWith(
"ID3"))
{
FS.Seek(6,
SeekOrigin.Begin);
FS.Read(Buffer, 0, 4);
nb[3] = Buffer[3] | ((Buffer[2] & 1) << 7);
nb[2] = ((Buffer[2] >> 1) & 63) | ((Buffer[1] & 3) << 6);
nb[1] = ((Buffer[1] >> 2) & 31) | ((Buffer[0] & 7) << 5);
nb[0] = ((Buffer[0] >> 3) & 15);

ulong FrameSize = 10 + (
ulong)nb[3] | ((
ulong)nb[2] << 8) | ((
ulong)nb[1] << 16) | ((
ulong)nb[0] << 24);

int TagSize =
Convert.ToInt32(FrameSize);

string flag;

int i = 0;

while (i < TagSize && fs > 0)
{
i += 10;
FS.Seek(i,
SeekOrigin.Begin);
FS.Read(Buffer, 0, 4);
flag = instEncoding.GetString(Buffer);
FS.Seek(i + 4,
SeekOrigin.Begin);
FS.Read(Buffer, 0, 4);
fs =
Convert.ToInt32(((
uint)Buffer[0] << 24) + ((
uint)Buffer[1] << 16) + ((
uint)Buffer[2] << 8) + ((
uint)Buffer[3]));

byte[] s =
new
byte[fs];
FS.Seek(i + 10,
SeekOrigin.Begin);
FS.Read(s, 0, fs);

Decoder d =
Encoding.UTF8.GetDecoder();

char[] chars =
new
Char[d.GetCharCount(s, 0, fs)];

int charLen = d.GetChars(s, 0, s.Length, chars, 0);
valTag =
"";

for (
int j = 0; j < chars.Length; j++)
{

if (chars[j].ToString() !=
"\0")
{
valTag += chars[j].ToString();
}
}

if (flag.CompareTo(
"TCON") == 0)
{
FS.Close();

return valTag;
}
i += fs;
}
FS.Close();

return
"";
}

else { FS.Close();
return
""; }
}

MMN

6 réponses

Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
51
Salut,
Depuis les mois (année?) que tu développes ce logiciel, on aura droit à une source hyper complète d'ici peu j'imagine  !
Sinon, un fichier txt qui stock 10'000 Mp3 c'est pas ce qu'il y a de plus indiqué, non ? Une DataBase, ça n'allait pas ? Si non, peut-être qu'un fichier Xml serait plus indiqué ? (plus facile à mettre en place?!).

Concernant ton problème, pourquoi ne pas faire un Trim() lors de la lecture du fichier voire juste avant l'affichage ?

<hr size="2" />-Blog-
Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
5 mai 2014

Ca fait 6 mois que j'y suis dessus, mais ça fait 3 ou 4 mois que je commence à être bon en Csharp. En fait mon programme fait le travail de 4 ou 5 employés, donc il est assez costaud.
Je ne pourrai pas vous mettre la source complête :
- En dehors de l'utilité qu'en a ma boite, ce programme est complêtement inutile.
- J'ai un devoir de discretion quant au travail de ma boite.
Mais dès que j'aurais le temps et dès que tout sera OK dans ce programme, je vous promet de vous mettre des sources en ligne.

Merci pour le trim(), j'y avait pas pensé ! Je vais voir si ça change quelque chose et vous tiens au courant.

MMN
Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
5 mai 2014

Je me suis planté, c'est pas mes genres qui déconnent mais mes albums, enfin ça change rien mais bon ...

Quand je met un "watch" pour visualiser mes valeurs, je vois ça :
"Electro\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
Ce sont ces "\0" qui me posent problême. C'est quoi comme caractère ??
C'est censé s'enlever avec trim() ??

MMN
Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
5 mai 2014

Ce sont des caractères de fin de chaîne non ???
Comment les faire sauter ?

MMN
Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
5 mai 2014

C'est bon j'ai trouvé.
Genre = Genre.replace("\0","");
Si ya une meilleure solution, je suis tout ouï  !

MMN
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
51
TrimEnd('\0' ) est certainement un peu plus rapide...


<hr size="2" />



-Blog-