Toon posts:

[C#] Rare tekens verwijderen uit string

Pagina: 1
Acties:
  • 230 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hoi allemaal

Ben bezig met een playlist voor een mp3 speler aan het maken zo als sommige weten.
Nu heb ik het probleem dat de ID3 tag met rare karakters is voorzien.
Zo als dit bijvoorbeeld.
code:
1
What's Going on���������������


Nu wil ik daarachter 1 of 2 achterzetten voor het aanduiden van dubbele bestanden.
Nu is het probleem dat ie door die karakters de 2 niet wordt weergegeven.
Dus dacht ik doe een split:
code:
1
string[] songName = Regex.Split(name,"�");


En roep hem daarna de file op met songName[0] maar nu zitten nog steeds die rare tekens bij.
Heeft iemand een idee hoe ik dit oplos.

[ Voor 7% gewijzigd door Verwijderd op 10-11-2004 16:09 . Reden: Rare tekens werden niet weergeven dus code tag gebruikt ]


Verwijderd

Probeer het eens op deze manier:

C#:
1
2
3
string inputText = "b&la �bl�a &bla;";
Regex unwantedPattern = new Regex(@"&.*?;");
string outputText = unwantedPattern.Replace(inputText, "");


Dat haalt alle tekens die tussen een & en een ; staan weg. Deze reguliere expressie is voor verbetering vatbaar, er zouden toevallig een & en een ; in een titel kunnen staan. Maar het idee is op deze manier duidelijk.

[ Voor 8% gewijzigd door Verwijderd op 10-11-2004 17:45 ]


Verwijderd

Topicstarter
:? het werkt niet

Verwijderd

:?

Programma:
code:
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
using System;
using System.Text.RegularExpressions;
using System.Threading;

namespace Test
{
    class TestFilter
    {       
        static void Main(string[] args)
        {
             string inputText = "What's Going on��"
                + "��������"
                + "�����";

             Console.WriteLine("inputText: " + inputText);

             Regex unwantedPattern = new Regex("&.*?;");
             string outputText = unwantedPattern.Replace(inputText, "");
         
             Console.WriteLine("\noutputText: " + outputText);

             Thread.Sleep(10000);
        }
    }
}

Uitvoer:
code:
1
2
3
4
inputText: What's Going on�����
����������

outputText: What's Going on


Zo niet, kun je dan specifieker zijn wat er niet werkt? Resultaat nog steeds met troeptekens, of foutmelding? Kan het zijn dat de rare tekens er pas later in komen te staan?

In het laatste geval zou het zo kunnen zijn dat er tekens in de string staan die in de string zelf een lelijke byte 0x00 representeren en elders geëscaped worden als &-tekenreeks. In dat geval zou je een replace moeten doen op "\x00".

[ Voor 21% gewijzigd door Verwijderd op 10-11-2004 18:55 . Reden: Toevoegen laatste alinea ]


Verwijderd

Topicstarter
Heb even op die ene manier die jij zei maar die werkt ook niet me output is dit:
Annihilation������������������
Het gaat om een byte code omdat ik deze uit de mp3 haal.

Verwijderd

Ik zou gokken op zoiets:

code:
1
2
3
4
5
string inputText = "What's Going on\x00\x00";
Console.WriteLine("\""+inputText+"\"");

string outputText = inputText.Replace("\x00", "");         
Console.WriteLine("\""+outputText+"\"");


code:
1
2
"What's Going on  "
"What's Going on"


Uit uitvoer blijkt dat de \x00 anders behandeld worden dan de spaties.

Als het op die manier niet werkt, dan durf ik er zo geen uitspraak over te doen...

Verwijderd

Ongetest:
code:
1
Die_string_erge_string.Trim();

of eventueel een overload ervan....

[ Voor 8% gewijzigd door Verwijderd op 10-11-2004 20:07 . Reden: code tags staan leuker ]


Verwijderd

Dit idee?

code:
1
string outputText = inputText.Trim('\x00');

[ Voor 85% gewijzigd door Verwijderd op 11-11-2004 08:16 . Reden: Ow, die overload! ;) ]


Verwijderd

Topicstarter
Verwijderd schreef op 10 november 2004 @ 18:59:
Heb even op die ene manier die jij zei maar die werkt ook niet me output is dit:
Annihilation������������������
Het gaat om een byte code omdat ik deze uit de mp3 haal.
Oeps ik heb het nog eens getest en het werkt.
Ik heb in de eerste geval de functie niet aangeroepen. :?

Verwijderd

Verwijderd schreef op 10 november 2004 @ 21:43:
Dit idee?

code:
1
string outputText = inputText.Trim('\x00');
die ja, maar kan zijn dat die &x0; al tot whitespace character wordt gerekend, dus dan zou de default trim ook moeten werken. ff testen als de default trim niet werkt

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 18-05 09:50

pjvandesande

GC.Collect(head);

Gewoon de Replace functie gebruiken van de string class. :?

Verwijderd

Topicstarter
De gewone trim functie werkt niet.
Alleen replace en deze functie werkt.
songName = name.Trim('\x00');

Verwijderd

Verwijderd schreef op 11 november 2004 @ 09:30:
De gewone trim functie werkt niet.
Alleen replace en deze functie werkt.
songName = name.Trim('\x00');
heb ook even getest. Ik denk dat het er aan ligt dat die &#x0 als string worden gelezen en niet als een raar teken.
replace("�","") werkt dan het beste

Verwijderd

Topicstarter
Dat werkt niet, alleen \x00 werkt.

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 18-05 09:50

pjvandesande

GC.Collect(head);

Verwijderd schreef op 11 november 2004 @ 12:52:
Dat werkt niet, alleen \x00 werkt.
string.Replace niet?

Verwijderd

Topicstarter
trim en replace werken met de code die ik heb gezegd.
Ohja heel funny heb ik heel me playlist af wil ik hem omzetten naar PDA.
Wordt XPath niet ondersteunt :(
Ga nu met Visual Studio 2005 Beta werken of weet iemand een oplossing?

  • dotcode
  • Registratie: Augustus 2003
  • Laatst online: 17:17

dotcode

///\00/\\

Zoek eens op welke encoding je gebruikt. Als je dat weet kan je ook vinden welke tekens je moet replacen. Anders wordt het altijd gokken welke je moet replacen.

Verwijderd

Verwijderd schreef op 11 november 2004 @ 16:22:
trim en replace werken met de code die ik heb gezegd.
Ohja heel funny heb ik heel me playlist af wil ik hem omzetten naar PDA.
Wordt XPath niet ondersteunt :(
Ga nu met Visual Studio 2005 Beta werken of weet iemand een oplossing?
had ff gezegd, dan had ik het je verteld.

je zult moeten met doen met childnodes collection en dan erdoorheen lopen. (helaas) en weet neit of er in VS2005 een oplossing zit, want volgens mij is het een beperking in het .Net framework. Dus dan moet je ook .NET CF versie 2 installeren als die er al is

Verwijderd

Verwijderd schreef op 10 november 2004 @ 16:08:
Ben bezig met een playlist voor een mp3 speler aan het maken zo als sommige weten.
Nu heb ik het probleem dat de ID3 tag met rare karakters is voorzien.
Zo als dit bijvoorbeeld.
code:
1
What's Going on���������������


Nu wil ik daarachter 1 of 2 achterzetten voor het aanduiden van dubbele bestanden.
Nu is het probleem dat ie door die karakters de 2 niet wordt weergegeven.
Dus dacht ik doe een split:
code:
1
string[] songName = Regex.Split(name,"�");

Heeft iemand een idee hoe ik dit oplos.
Om welke versie van ID3 gaat het?

Deze string past 'never nooit nie' in de v1-tag, omdat deze maximal 30 karakters aan kan.

Het ligt gewoon aan je code!
Hoe lees je de ID3-tag uit?
Bij het uitlezen moet je stoppen bij de eerste 0-karakter.

Verwijderd

Topicstarter
Ik heb gelezen op msdn dat 4.2 van iets wat ook op de pda staat wel xpath ondersteunt. Dus ga ik 2005 proberen school heeft toch een licentie :P

Ik stop niet bij de eerst nul karakter.
Ik heb het uitlezen uit een ander niet werkend programma gehaald.

Verwijderd

Deze string past 'never nooit nie' in de v1-tag, omdat deze maximal 30 karakters aan kan.
Elke &#x0 ; representeert 1 karakter. Als je in de string van FerRory goed telt, dan zie je dat het inderdaad 30 karakters zijn, dus past precies! :*)

Verwijderd

Verwijderd schreef op 11 november 2004 @ 21:12:
Ik heb gelezen op msdn dat 4.2 van iets wat ook op de pda staat wel xpath ondersteunt. Dus ga ik 2005 proberen school heeft toch een licentie :P

Ik stop niet bij de eerst nul karakter.
Ik heb het uitlezen uit een ander niet werkend programma gehaald.
ff rondgekeken. Het ziet er naar uit dat Windows CE 4.2 inderdaad xpath ondersteund. Maar dat is dus een kwestie van je OS van je PDA upgraden ipv de 2005 versie gebruiken. misschien dat er dus een upgrade te downloaden is. geen id verder

Verwijderd

Topicstarter
Moet ik natuurlijk wel me applicatie kunnen compile Visual Studio 2003 :+

Verwijderd

Verwijderd schreef op donderdag 11 november 2004 @ 23:28:
[...]


Elke &#x0 ; representeert 1 karakter. Als je in de string van FerRory goed telt, dan zie je dat het inderdaad 30 karakters zijn, dus past precies! :*)
Ik tel goed. Zoals de string hierboven staat zijn het gewoon geen 30 karakters. De werkelijke string wordt omgevormd zodat dit formaat eruit komt. Dit betekent dus dat er ergens een conversie plaats vindt.

[nogmaals]
Het ligt gewoon aan je code!
Hoe lees je de ID3-tag uit?
Bij het uitlezen moet je stoppen bij de eerste 0-karakter.
[/nogmaals]

Verwijderd

Verwijderd schreef op zondag 14 november 2004 @ 20:38:
[...]

Ik tel goed. Zoals de string hierboven staat zijn het gewoon geen 30 karakters. De werkelijke string wordt omgevormd zodat dit formaat eruit komt. Dit betekent dus dat er ergens een conversie plaats vindt.

[nogmaals]
Het ligt gewoon aan je code!
Hoe lees je de ID3-tag uit?
Bij het uitlezen moet je stoppen bij de eerste 0-karakter.
[/nogmaals]
Zoals in de vorige posts te lezen / concluderen valt, vindt er inderdaad conversie plaats. Het punt in de code waar FerRory werkt, is na het uitlezen en voor de conversieslag. Om de ID3-tag uit te lezen, gebruikt FerRory een component dat hij niet zelf geschreven heeft. Dus stoppen na het eerste 0-karakter is geen optie. Hij moet het doen met een string van 30 karakters waarvan de laatste 0-karakters zijn. In bovenstaande posts wordt een oplossing geboden om deze 0-karakters te strippen. Daarmee is het probleem opgelost!

Waar wil je precies naartoe met je bewering dat de string niet 30 karakters lang is? En op wat voor manier is de opmerking "Het ligt gewoon aan je code!" constructief?
Pagina: 1