Rückgabewert im Powershell-Skript, gespeichert in Zeichenfolge, nicht in utf8

931
josh21

Ich versuche Tabellen mit Hilfe von Tabula und Powershell aus einem PDF zu extrahieren. Wenn ich den Befehl direkt in der Powershell-Konsole eingebe, erhalte ich das erwartete Ergebnis (in utf8 mit Umlautsymbolen).

java -jar "./tabula-java/$tabulaVersion" --spreadsheet -a 114,53,180,556 "./table.pdf" 

Wenn ich es jedoch in eine String-Variable stecke und dann in eine Datei schreibe, werden die Umlaute-Symbole zu Kauderwelsch

$text = java -jar "./tabula-1.0.1-jar-with-dependencies.jar" --spreadsheet -a 114,53,180,556 "./table.pdf"  Set-Content -Path "./file.txt" -Value $text 

Auch wenn ich die Variable in der Konsole drucke, werden die Umlaute-Symbole nicht richtig angezeigt

$text = java -jar "./tabula-1.0.1-jar-with-dependencies.jar" --spreadsheet -a 114,53,180,556 "./table.pdf"  Write-Output $text  

Gibt es eine Möglichkeit, es in einer String-Variablen zu speichern (und damit den Inhalt bearbeiten zu können) und in eine Datei zu schreiben, wobei die utf8-Codierung (ohne BOM) beibehalten wird?

Der Ansatz von https://stackoverflow.com/a/5596984/1786528 funktioniert für mich ebenfalls nicht

$Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding $False [System.IO.File]::WriteAllLines($filepath, $text, $Utf8NoBomEncoding) 

Ich erhalte keine Fehlermeldung, aber es wird auch keine Datei erstellt oder eine Zeile hinzugefügt.

Aktualisieren:

[System.IO.File]::WriteAllLineserstellt eine Datei (in UTF ohne BOM), ich habe nur einen relativen Pfad verwendet und nicht gesetzt [System.Environment]::CurrentDirectory = (Get-Location).Path. Trotzdem sind die Umlautsymbole nicht korrekt.

Weitere Details

Fall 1: Ausgabe direkt in der Konsole, z

java -jar "./tabula-1.0.1-jar-with-dependencies.jar" --spreadsheet "./table.pdf" 

Fall 2: Ausgabe in Variable gespeichert, dann in der Konsole gedruckt, z

$text = java -jar "./tabula-1.0.1-jar-with-dependencies.jar" --spreadsheet "./table.pdf"  Write-Output $text  

Fall 3: Ausgabe in Variable gespeichert, jedoch mit -D"file.encoding=UTF-8", dann in der Konsole gedruckt, z

$text = java -D"file.encoding=UTF-8" -jar "./tabula-1.0.1-jar-with-dependencies.jar" --spreadsheet "./table.pdf"  Write-Output $text  

Aktualisieren:

$OutputEncoding= US-ASCII und [System.Console]::OutputEncoding= OEM United States (IBM437)

Fall 4: Ausgabe direkt in der Konsole (mit [System.Console]::OutputEncodingvorheriger Änderung ), z

[System.Console]::OutputEncoding = System.Text.Encoding]::GetEncoding(1252) java -jar "./tabula-1.0.1-jar-with-dependencies.jar" --spreadsheet "./table.pdf"  

Fall 5: Ausgabe in Variable gespeichert, dann in Konsole gedruckt (mit [System.Console]::OutputEncodingvorheriger Änderung ), z

[System.Console]::OutputEncoding = System.Text.Encoding]::GetEncoding(1252) $text = java -jar "./tabula-1.0.1-jar-with-dependencies.jar" --spreadsheet "./table.pdf"  Write-Output $text  

Dies führt zu Umlautsymbolen

pdf case 1 case 2 case 3 case 4 case 5 ä ä Σ ├ñ „ ä ö ö ÷ ├╢ ” ö ü ü ⁿ ├╝ ü 
1
Sie könnten versuchen, $ text = java -jar "./tabula-java/$tabulaVersion" --spreadsheet -a 114,53,180,556 $ Dateipfad | out-file -FilePath "./file.txt" -Encoding UTF8` Wenn dies nicht funktioniert, ist die Ausgabe höchstwahrscheinlich bereits falsch SimonS vor 6 Jahren 0
Leider nicht. Ich denke auch, dass der Täter bei $ text = java ist (siehe mein Update). Aber ich verstehe nicht, warum die Antwort korrekt angezeigt wird, wenn ich einfach "java ..." benutze und sobald ich sie in einer Variablen speichere, nicht mehr. Es erstellt auch eine Arbeitsdatei, wenn ich die Ausgabe direkt mit dem Tabulabefehl schreibe (mithilfe von "-o" ./file.txt "`). josh21 vor 6 Jahren 0
Schauen Sie sich diese Antwort bei Stack-Überlauf an - Sie können die UTF8-Codierung bereits in `java 'angeben.` https://stackoverflow.com/questions/6733029/output-as-utf-8-encoding-in-java fügt `hinzu -Dfile.encoding = UTF-8` sollte den Trick ausführen SimonS vor 6 Jahren 0
Das klang vielversprechend, aber ich erhalte folgende Fehlermeldung: Fehler: Hauptklasse .encoding = UTF-8 konnte nicht gefunden oder geladen werden. Ich habe versucht mehr über `-Dfile` zu ​​finden, aber nicht sehr erfolgreich josh21 vor 6 Jahren 0
hmm ich denke du musst auf einen Java-Kommandozeilen-Profi warten. Sie sollten nach 'Java Commandline Output UTF8' oder wahrscheinlich sogar nach 'Java Tabula UTF8 Encoding' suchen. Kann nicht weiter helfen, da ich nicht viel über Java weiß (vielleicht hilft readme.md in github) SimonS vor 6 Jahren 0
Vielleicht ist das nicht verwandt, aber vielleicht ist es so: Wenn ich an einem PS-Skript mit Exiftool (das UTF unterstützt) gearbeitet habe, hatte ich das gleiche Problem wie Sie (dasselbe mit der Arbeitskonsole, das gleiche mit dem nicht funktionierenden UTF -Codierung). Leider war die einzige (Nicht-) Lösung, die ich finden konnte, das Hinzufügen der Stückliste. Was ich sagen möchte ist, dass ich nicht denke, dass Java der Täter hier ist. flolilolilo vor 6 Jahren 0
Bitte zeigen Sie einige Beispiele (mit mehr _umlauted_- sowie _common_-Buchstaben) des erwarteten Ergebnisses und des entsprechenden Kauderwelschs (für jeden gegebenen Fall). JosefZ vor 6 Jahren 0
Versuchen Sie `java -D" file.encoding = UTF-8 "...". Sie können auch versuchen, die Umgebungsvariable `JAVA_TOOL_OPTIONS` auf` -Dfile.encoding = UTF-8` zu setzen. Bacon Bits vor 6 Jahren 0
Mit `java -D" file.encoding = UTF-8 "` gibt es keinen Fehler mehr und ich bekomme eine andere Ausgabe, die aber immer noch nicht korrekt ist (Datei ist UTF-16 LE). "ä" wird zu "├ñ", ohne "java -D" file.encoding = UTF-8 "", es war "Σ" josh21 vor 6 Jahren 0
Zwischen ** Fall 1 ** und ** Fall 2 ** gibt es einen seltsamen und verwirrenden Unterschied. Was ist Ihr "$ OutputEncoding" und "[System.Console] :: OutputEncoding"? Was passiert mit `[System.Console] :: OutputEncoding = [System.Text.Encoding] :: GetEncoding (1252)` unmittelbar vor dem Aufruf von `java…` / `$ text = java…`? JosefZ vor 6 Jahren 0
`$ OutputEncoding` = US-ASCII und` [System.Console] :: OutputEncoding` = OEM United States (IBM437). Ich habe die neuen Fälle zu meinem Beitrag hinzugefügt josh21 vor 6 Jahren 0
Flagrant [Mojibake] (https://en.wikipedia.org/wiki/Mojibake) Vorkommen: Versuchen Sie zum Beispiel `[System.IO.File] :: WriteAllLines ($ MyPath, 'äöü', [System.Text.UTF8Encoding) ] ($ False)) `. Dann deckt `[System.IO.File] :: ReadAllLines ($ MyPath, [System.Text.Encoding] :: GetEncoding (437))` Ihren _case 3_ ab (und _case 5_ ändert `437` in` 1252`) usw Leider weiß ich nicht, wie ich die Ausgabecodierung für "Java" konfigurieren soll ... JosefZ vor 6 Jahren 0
Vielen Dank für die Erklärung. Der Täter ist also Java, nicht Powershell? josh21 vor 6 Jahren 0

0 Antworten auf die Frage