Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning.
Een goede grap mag vrienden kosten.
Wederom geeft google niet een oplossing.
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning.
i5-12600K PRIME Z690M-PLUS D4 64GB 980 Pro M.2 1TB MBA M1 13" 8GB 256GB (Late '20)
1
| WideCharToString |
Een goede grap mag vrienden kosten.
Hoe kan ik zeker weten dat het unicode is en niet Multybyte code?
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning.
Een goede grap mag vrienden kosten.
Wat ik nu heb geprobeerd werkt enigzins, maar nog niet helemaal.
1
2
| Readln(SFilename, sLine); WideCharToString(pWideChar(sLine)); |
uitkomst:
?Windows Registry Editor Version 5.00??D?Á?
[ Voor 5% gewijzigd door Devour op 18-06-2004 13:55 ]
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning.
"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| procedure TForm1.Convert();
var
sFilename : Textfile;
sLine : AnsiString;
begin
//inlezen van de file
AssignFile(SFilename, Regfilename);
Reset(SFilename);
while not EOF(SFilename) do begin
Readln(SFilename, sLine);
sLine := WideCharToString(pWideChar(sLine));
sFullList.add(sLine);
end;
CloseFile(SFilename);
end; |
Ja, dus
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning.
Die
Je had er nog niet bij nagedacht dat je nu dus die data eerst in een ansistring leest, die cast naar een pWideChar en dan pas door de WideCharToString functie voert?
Jou zou eens kunnen proberen om van sline ook een pWideChar of een WideString te maken zodat er geen automatische omzetting meer plaats vindt, en je die cast ook niet meer nodig heb.
[ Voor 30% gewijzigd door Creepy op 18-06-2004 14:03 ]
"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney
Ik heb verschillende casts geprobeer, maar een beter resultaat dan hierboven lukt niet
Ik vindt het ook zo vreemd dat een *.reg file unicode is ,... zou het niet iets anders kunnen zijn?
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning.
Devour schreef op 18 juni 2004 @ 14:34:
Ik vindt het ook zo vreemd dat een *.reg file unicode is ,... zou het niet iets anders kunnen zijn?
Waarom zou dat vreemd zijn? Er zijn ook andere versies van Windows dan de Nederlandse en Engelse. Hoe wou jij Chinese tekens opslaan in een bestand waar alleen een Westerse karakterset in mag?
'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.
Een goede grap mag vrienden kosten.
De eerste 2 characters zijn 0xFFFE, dat is de identifier voor een Unicode-textfile.Devour schreef op 18 juni 2004 @ 13:41:
Ik heb nu meerder oplossingen geprobeerd, maar het omzetten wil echt niet lukken. De methode van WideString naar AnsiString/String omzetten werkt niet.
Hoe kan ik zeker weten dat het unicode is en niet Multybyte code?
1
2
3
4
5
6
7
8
9
| iRegFile := TIniFile.Create(RegFilename); //inlezen van de file
iRegFile.ReadSections(sKey); //inlezen van de Keys
//converteren
sOutput.Add('item: Edit Registry');
For i:=0 to sKey.Count-1 do //doorlopen van de keys
begin
iKeyRoot:=GiveRoot(sKey[i]); //bepalen van de Hkey
MyReadSectionValues(sKey[i],sValue); //inlezen van Value |
Het component TIniFile converteerd de file direct goed.
Ook hier zitten een paar nadelen aan, want een key zonder value wordt overgeslagen. ( naam='' wordt overgeslagen)
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning.
Correct is:tomatoman schreef op 18 juni 2004 @ 15:03:
Je zult de hele tekst als een geheel moeten uitlezen, dan van unicode naar ANSI converteren en daarna pas kun je de tekst in een TStringList bewerken. Ik betwijfel of dat lukt met een Textfile. Eventueel moet je het bestand inlezen als een TFileStream of een memory-mapped file.
• hele bestand inlezen in buffer
• eerste 2 bytes testen op 0xFFFE
• zo nee, hele string hardpointered in AnsiString frotten
• zo ja, eerste 2 bytes overslaan en de rest hard in WideString frotten
De conversie hoef je zelf niet te doen, AnsiString en WideString hebben onderling voldoende conversiemogelijkheden. Vergeet niet dat je data weggooit als je van een WideString naar een AnsiString gaat (moet om die reden ook expliciet gebeuren middels constructor).
Ik vermoed dat een deel ANSI code is en een deel Unicode.
Dit kan ik helaas niet helemaal theoretischonderbouwen, maar in de praktijk heb ik gezien dat delen wel te converteren zijn, maar dat andere delen dan niet meer kloppen. Ik heb nu dus een andere manier gevonden die beter werkt. ( via TiniFile )
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning.
Een file is natuurlijk altijd helemaal unicode of helemaal niet. Als je nou de volgende keer een unicode file in wilt lezen en converteren naar ansi dan werkt het volgende:Devour schreef op 18 juni 2004 @ 15:41:
Wat je schrijft klinkt heel geloofwaardig, maar of het in de praktijk ook werkt is een heel ander verhaal. Ik heb nu heel wat geprobeerd, met verschillende typecasts en verschillende convertfuncties, maar niet werkt helemaal lekker.
Ik vermoed dat een deel ANSI code is en een deel Unicode.
Dit kan ik helaas niet helemaal theoretischonderbouwen, maar in de praktijk heb ik gezien dat delen wel te converteren zijn, maar dat andere delen dan niet meer kloppen. Ik heb nu dus een andere manier gevonden die beter werkt. ( via TiniFile )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| var
Stream : TFileStream;
Output : String;
Identifier : Array[0..1] of byte;
Buffer : Array[0..1023] of Byte;
Count : Integer;
begin
Stream := TFileStream.Create('C:\test.reg', fmOpenRead);
Stream.Read(Identifier,2);
if (Identifier[0] = $FF) and (Identifier[1] = $FE) then
begin
Count := Stream.Read(Buffer,1024);
while Count <> 0 do
begin
Output := Output + WideCharLenToString(@Buffer,Count div 2);
Count := Stream.Read(Buffer,1024);
end;
end;
FreeAndNil(Stream); |
Daarna kun je Output gebruiken als gewone string met de inhoud van de gehele file.
[ Voor 10% gewijzigd door __fred__ op 18-06-2004 17:04 ]
We adore chaos because we like to restore order - M.C. Escher
Prachtige constructie, maar is sFullList.LoadFromFile(Regfilename) niet een stuk makkelijker?Devour schreef op 18 juni 2004 @ 12:57:
Delphi:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 procedure TForm1.Convert(); var sFilename : Textfile; sLine : AnsiString; begin sFullList := TStringList.Create; AssignFile(SFilename, Regfilename); Reset(SFilename); while not EOF(SFilename) do begin Readln(SFilename, sLine); sFullList.add(sLine); end; CloseFile(SFilename); end;
"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock
Ik zal voor optimalisatie doeleinden nog een aantal van jullie oplossing uitwerken.
Ik gebruik nu de Tinifile classe van Borland en dat werkt wel, maar een reg file is hier en daar anders dan een inifile. ( bv: lange keys worden afgebroken door een '/'. De Tinifile classe kan dan niet de volgende regel opvragen. Dus heb ik de Tinifile class op een aantal punten aangepast)
Nogmaals bedankt
[ Voor 5% gewijzigd door Devour op 28-06-2004 09:27 ]
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots. So far, the Universe is winning.