[Java] special characters probleem icm cmd.exe

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Twazerty
  • Registratie: April 2006
  • Laatst online: 17:33

Twazerty

AVCHDCoder developer

Topicstarter
Ik heb een probleem en ik krijg het niet opgelost. Ik stuur een command met java naar cmd.exe. Alles werkt zoals het moet maar zodra er een special character in de bestandsnaam zit dan word de command niet goed uitgevoerd. In dit geval gaat het over de letter: Ï. Ofwel een gewone unicode character (Unicode Character 'LATIN CAPITAL LETTER I WITH DIAERESIS' (U+00CF))

Voorbeeld bestandsnaam:
GAÏA.mkv
Als ik met de debugger bekijk wat er in de variable staat zie ik daar mooi de Ï terug. Een voorbeeld van een volledige cmd command:
"C:\MediaInfo\MediaInfo.exe" "--Inform=file://C:\input.txt" "F:\GAÏA.mkv"

Als ik bovenstaande afdruk op het scherm en vervolgens handmatig in cmd.exe plak dan word de command gewoon uitgevoerd. Maar zodra ik het in java doet word het niet uitgevoerd. Verander ik de bestandsnaam naar GAIA.mkv zonder de puntjes op de i dan word de command gewoon uitgevoerd in java.

Ik snap hier niks van, wie kan mij op weg helpen?

Ruisende versterker: schakel je subwoofer in.


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Hoe voer je die command uit vanuit Java? Lijkt me wel relevant...
(Ik vermoed trouwens dat 't daar ook zit en het zou me to be honest niets verbazen als er gewoon geen unicode support voor is)

Hmm; even gegoogled... Zoiets? Zoiets?

[ Voor 45% gewijzigd door RobIII op 24-06-2009 17:23 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Twazerty
  • Registratie: April 2006
  • Laatst online: 17:33

Twazerty

AVCHDCoder developer

Topicstarter
Java:
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
public CmdExecuter(String arg, int mode, InputFileAnalyze analyzer){
        try
        {            
            String osName = System.getProperty("os.name" );
            String[] cmd = new String[1];
            
            cmd[0] = "cmd.exe" ;
            
            rt = Runtime.getRuntime();
            System.out.println("Execing " + cmd[0]);
            proc = rt.exec(cmd);
            // any error message?
            Stream errorGobbler = new Stream(proc.getErrorStream(), "ERROR", mode, analyzer);
            
            // any output?
            Stream outputGobbler = new Stream(proc.getInputStream(), "OUTPUT", mode, analyzer);
                
            // kick them off
            errorGobbler.start();
            outputGobbler.start();
            //proc.destroy();
            OutputStreamWriter osw = new OutputStreamWriter(proc.getOutputStream());
            writer = new BufferedWriter(osw);
            
            writer(writer, arg);
            // any error???
            int exitVal = proc.waitFor();
            System.out.println("ExitValue: " + exitVal);        
        } catch (Throwable t){
            t.printStackTrace();
        }
    }
    
    public void writer(BufferedWriter writer, String arg){
        try {
            writer.write(arg + "\n");

            writer.write("exit\n");
            writer.close();
            
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }


Bovenstaande manier runt de code. De methode writer schrijft de daadwerkelijke command weg.

Ruisende versterker: schakel je subwoofer in.


Acties:
  • 0 Henk 'm!

  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 22:40

Nick_S

++?????++ Out of Cheese Error

Wat is de output als je als commando "echo F:\GAÏA.mkv" uitvoert? Misschien komt het verkeerd aan bij cmd.exe.

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


Acties:
  • 0 Henk 'm!

  • Twazerty
  • Registratie: April 2006
  • Laatst online: 17:33

Twazerty

AVCHDCoder developer

Topicstarter
Nick_S schreef op woensdag 24 juni 2009 @ 17:21:
Wat is de output als je als commando "echo F:\GAÏA.mkv" uitvoert? Misschien komt het verkeerd aan bij cmd.exe.
Dit komt er uit de java output window als ik "echo F:\GAÏA.mkv" wegschrijf naar cmd.exe in java:
F:\GAÏA.mkv

Ruisende versterker: schakel je subwoofer in.


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Twazerty schreef op woensdag 24 juni 2009 @ 17:26:
[...]


Dit komt er uit de java output window als ik "echo F:\GAÏA.mkv" wegschrijf naar cmd.exe in java:
F:\GAÏA.mkv
Alleen is het java output window heel iets anders dan een CMD console ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Twazerty
  • Registratie: April 2006
  • Laatst online: 17:33

Twazerty

AVCHDCoder developer

Topicstarter
RobIII schreef op woensdag 24 juni 2009 @ 17:36:
[...]

Alleen is het java output window heel iets anders dan een CMD console ;)
In het java output window krijg ik te zien wat cmd uitspuugt ;)

De command in zijn geheel word gewoon niet uitgevoerd. (Ik krijg niks terug van cmd dus de data die terug zou moeten komen kan ik nu nooit inlezen) en de echo krijg ik gewoon te zien. Die code word dus wel uitgevoerd.

Edit: De command word niet direct in Process geschreven. Alleen cmd.exe word naar Process geschreven. De argumenten word daarna pas geschreven. ï word geschreven en komt ook terug. Enkel wanneer ik de complete command stuur word het niet uitgevoerd. Als ik die command in cmd.exe run werkt het wel.

[ Voor 24% gewijzigd door Twazerty op 24-06-2009 17:45 ]

Ruisende versterker: schakel je subwoofer in.


Acties:
  • 0 Henk 'm!

  • Bl4ckviper
  • Registratie: Mei 2002
  • Laatst online: 06-08 00:09

Bl4ckviper

BlaBlaBla

Wellicht proberen met ProcessBuilder?

Java:
1
ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2");


Heb ooit iets gehad met het Nero CLI dat niet werkte met Runtime.exec en wel met ProcessBuilder..

Hier wat meer info.

[ Voor 45% gewijzigd door Bl4ckviper op 25-06-2009 10:03 ]

Be fast .... Be furious....


Acties:
  • 0 Henk 'm!

  • Macros
  • Registratie: Februari 2000
  • Laatst online: 15-05 16:29

Macros

I'm watching...

De OutputStreamWriter die je aanmaakt converteerd de unicode characters in Java naar een bepaalde charset. Als je er geen opgeeft zoals jij doet dan converteerd hij ze mbv de default charset. Misschien staat die niet goed en moet je daar eens mee spelen.

"Beauty is the ultimate defence against complexity." David Gelernter


Acties:
  • 0 Henk 'm!

  • Twazerty
  • Registratie: April 2006
  • Laatst online: 17:33

Twazerty

AVCHDCoder developer

Topicstarter
Macros schreef op donderdag 25 juni 2009 @ 12:35:
De OutputStreamWriter die je aanmaakt converteerd de unicode characters in Java naar een bepaalde charset. Als je er geen opgeeft zoals jij doet dan converteerd hij ze mbv de default charset. Misschien staat die niet goed en moet je daar eens mee spelen.
Zodra ik UTF8 als parameter meegaf aan OutputStreamWriter kreeg ik encoding conversie fouten. tekens werden niet goed omgezet. Ben wezen zoeken heb heb uiteindelijk dit toegevoegd in de main methode:
System.setProperty("file.encoding", "UTF8");

Maar helaas geen resultaat.

@Bl4ckviper, Hierdoor moet ik een hele hoop aanpassen en dat doe ik liever niet aangezien wat ik nu heb verder gewoon werkt.

Ruisende versterker: schakel je subwoofer in.


Acties:
  • 0 Henk 'm!

  • Bl4ckviper
  • Registratie: Mei 2002
  • Laatst online: 06-08 00:09

Bl4ckviper

BlaBlaBla

Je zou een testcase kunnen maken of het werkt.

En als dat het enige stuk code is wat je moet omschrijven denk ik dat het wel de moeite waard is..

Be fast .... Be furious....


Acties:
  • 0 Henk 'm!

  • Twazerty
  • Registratie: April 2006
  • Laatst online: 17:33

Twazerty

AVCHDCoder developer

Topicstarter
Bl4ckviper schreef op donderdag 25 juni 2009 @ 14:21:
Je zou een testcase kunnen maken of het werkt.

En als dat het enige stuk code is wat je moet omschrijven denk ik dat het wel de moeite waard is..
Zijn totaal zo'n 400 regels code die er direct mee te maken hebben (Het gehele cmd.exe gedeelte want maakt deel uit van een groot geheel). Ik zal die ProcessBuilder eens afzonderlijk proberen. Eerst een uizoeken hoe dat ding werkt.

Edit:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
try {
            Process pb = new ProcessBuilder("\"C:\\MediaInfo\\MediaInfo.exe\"", "\"--Inform=file://C:\\MediaInfo\\input.txt\"", "\"F:\\GAÏA.mkv\"").start();
            InputStream is = pb.getInputStream();
            InputStreamReader isr = new InputStreamReader(is);
            BufferedReader br = new BufferedReader(isr);
            String line;

            while ((line = br.readLine()) != null) {
                System.out.println(line);
            }
        } catch (IOException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        }


Met bovenstaande werkt het :) en ik heb geen cmd.exe meer nodig :) Deze code is toch wel supereasy in vergelijking met mijn andere code. Alleen nu nog kijken hoe ik dit ingebouwd krijg want er zal op veel plaatsen iets gewijzigd moeten worden.

[ Voor 54% gewijzigd door Twazerty op 25-06-2009 14:43 ]

Ruisende versterker: schakel je subwoofer in.


Acties:
  • 0 Henk 'm!

  • Bl4ckviper
  • Registratie: Mei 2002
  • Laatst online: 06-08 00:09

Bl4ckviper

BlaBlaBla

succes.

Ah ziet er naar uit als een oplossing he ;)

Altijd gezeik die CLI dingen :D

[ Voor 86% gewijzigd door Bl4ckviper op 25-06-2009 14:52 ]

Be fast .... Be furious....


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Twazerty schreef op donderdag 25 juni 2009 @ 13:49:
Zodra ik UTF8 als parameter meegaf aan OutputStreamWriter kreeg ik encoding conversie fouten. tekens werden niet goed omgezet.
Logisch, Windows doet niets met UTF-8. CP 1252 zou je waarschijnlijk moeten hebben.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Twazerty
  • Registratie: April 2006
  • Laatst online: 17:33

Twazerty

AVCHDCoder developer

Topicstarter
.oisyn schreef op donderdag 25 juni 2009 @ 14:58:
[...]

Logisch, Windows doet niets met UTF-8. CP 1252 zou je waarschijnlijk moeten hebben.
CP 1252 is de standaard codering toen ik de codering opvroeg van de JVM.

Ruisende versterker: schakel je subwoofer in.


Acties:
  • 0 Henk 'm!

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

.oisyn schreef op donderdag 25 juni 2009 @ 14:58:
[...]

Logisch, Windows doet niets met UTF-8. CP 1252 zou je waarschijnlijk moeten hebben.
Als je #00CF in UTF-8 hebt en ongeconverteerd doorgeeft aan een programma dat het als CP-1252 interpreteert, dan zou je geen encodingsprobleem hebben, want in CP-1252 is dat ook de I met diaresis.
Nee wacht, 00CF wordt al met twee bytes gecodeerd in UTF-8, dus dat gaat inderdaad niet werken.

[ Voor 10% gewijzigd door Confusion op 25-06-2009 18:05 ]

Wie trösten wir uns, die Mörder aller Mörder?


Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
.oisyn schreef op donderdag 25 juni 2009 @ 14:58:
[...]
Logisch, Windows doet niets met UTF-8. CP 1252 zou je waarschijnlijk moeten hebben.
Waarom? Dat is ook alleen gangbaar in West-Europa en de VS. Windows gebruikt in Oost Europa en Japan weer andere charsets. En als je "speciale" tekens gaat gebruiken, is dat meestal toch omdat je software voor buiten nederland wil maken.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Acties:
  • 0 Henk 'm!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 00:05
Als je CMD /? uitvoert, dan zie je daarbij /A en /U switches, /A is voor de default 8 bits charset en /U voor Unicode. Ik vermoed dat op jouw PC /A de default is voor CMD.EXE, terwijl Java standaard Unicode gebruikt.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1