Возвращаемое значение в скрипте powershell, хранящемся в строке, а не utf8

767
josh21

Я пытаюсь извлечь таблицы из PDF, используя Tabula и PowerShell. Когда я ввожу команду непосредственно в консоль PowerShell, я получаю ожидаемый результат (в utf8 с символами umlaut)

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

Но когда я помещаю его в строковую переменную, а затем записываю в файл, символы умлаут становятся бессмысленными

$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 

Даже если я распечатаю переменную в консоли, символы умлаут отображаются неправильно

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

Есть ли способ сохранить его в строковой переменной (и, следовательно, иметь возможность манипулировать содержимым) и записать его в файл с сохранением кодировки utf8 (без BOM)?

Использование подхода из https://stackoverflow.com/a/5596984/1786528 у меня тоже не работает

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

Я не получаю сообщение об ошибке, но также не создается файл или добавляется строка.

Обновить:

[System.IO.File]::WriteAllLinesсоздает файл (в UTF без BOM), я просто использовал относительный путь и не задал [System.Environment]::CurrentDirectory = (Get-Location).Path. Но тем не менее умлаут-символы не верны.

Дополнительные детали

случай 1: вывод непосредственно в консоль, например

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

случай 2: выходные данные сохраняются в переменной, затем печатаются в консоли, например

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

случай 3: выходные данные хранятся в переменной, но с -D"file.encoding=UTF-8", затем печатаются в консоли, например

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

Обновить:

$OutputEncoding= US-ASCII и [System.Console]::OutputEncoding= OEM США (IBM437)

случай 4: вывод непосредственно в консоль (с изменением [System.Console]::OutputEncodingзаранее), например

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

случай 5: выходные данные сохраняются в переменной, затем печатаются в консоли (с [System.Console]::OutputEncodingпредварительным изменением ), например

[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  

Это приведет к этому для умлаут символов

pdf case 1 case 2 case 3 case 4 case 5 ä ä Σ ├ñ „ ä ö ö ÷ ├╢ ” ö ü ü ⁿ ├╝ ü 
1
Вы можете попробовать `$ text = java -jar" ./tabula-java/$tabulaVersion "- таблица -a 114,53,180,556 $ filepath | out-file -FilePath "./file.txt" -Кодирование UTF8`, если оно не работает, вывод скорее всего уже неправильный SimonS 6 лет назад 0
К сожалению, это не так. Я также думаю, что виновник находится в `$ text = java ...` (см. Мое обновление). Но я не понимаю, почему ответ отображается правильно, когда я просто использую `java ...` и как только я сохраню его в переменной, больше нет. Он также создает рабочий файл, если я пишу вывод напрямую с помощью команды tabula (используя `-o" ./file.txt "`) josh21 6 лет назад 0
посмотрите на этот ответ о переполнении стека - похоже, что вы можете указать кодировку UTF8 уже в `java ...` https://stackoverflow.com/questions/6733029/output-as-utf-8-encoding-in-java добавляя ` -Dfile.encoding = UTF-8` должен сделать свое дело SimonS 6 лет назад 0
Это звучало многообещающе, но я получаю это сообщение об ошибке `Ошибка: не удалось найти или загрузить основной класс .encoding = UTF-8`. Я пытался найти больше о `-Dfile`, но не очень успешно josh21 6 лет назад 0
Хм, я думаю, вы должны ждать профессионала командной строки Java. Вы должны искать `вывод командной строки java UTF8` или, возможно, даже` java tabula UTF8 encoding`. Больше ничего не могу поделать, так как я не слишком много знаю о Java (может быть, readme.md в github помогает) SimonS 6 лет назад 0
Может быть, это не связано, но, может быть, это так: при работе с PS-скриптом, в котором есть exiftool (который поддерживает UTF), у меня возникла та же проблема, что и у вас (то же самое с рабочей консолью, то же самое с нерабочим UTF). -encoding). К сожалению, единственное (не) решение, которое я мог придумать, это добавить спецификацию. Так что я хочу сказать, что я не думаю, что Java является виновником здесь. flolilolilo 6 лет назад 0
Пожалуйста, покажите некоторый пример (с большим количеством _umlauted_, а также _common_ букв) ожидаемого результата и соответствующего тарабарщины (для каждого конкретного случая). JosefZ 6 лет назад 0
Попробуйте `java -D" file.encoding = UTF-8 "...`. Вы также можете попробовать установить переменную среды `JAVA_TOOL_OPTIONS` в` -Dfile.encoding = UTF-8`. Bacon Bits 6 лет назад 0
С `java -D" file.encoding = UTF-8 "` больше нет ошибок, и я получаю другой вывод, но он все еще не корректен (файл UTF-16 LE). `ä` становится` ├ñ`, без `java -D" file.encoding = UTF-8 "` это было `Σ` josh21 6 лет назад 0
Существует странная и озадачивающая разница между ** случаем 1 ** и ** случаем 2 **. Что такое ваши `$ OutputEncoding` и` [System.Console] :: OutputEncoding`? Что происходит с `[System.Console] :: OutputEncoding = [System.Text.Encoding] :: GetEncoding (1252)` непосредственно перед вызовом `java…` / `$ text = java…`? JosefZ 6 лет назад 0
`$ OutputEncoding` = US-ASCII и` [System.Console] :: OutputEncoding` = OEM США (IBM437). Я добавил новые случаи в свой пост josh21 5 лет назад 0
Возникновение вопиющего [mojibake] (https://en.wikipedia.org/wiki/Mojibake): например, попробуйте `[System.IO.File] :: WriteAllLines ($ MyPath, 'äöü', [System.Text.UTF8Encoding ] ($ False)) `. Затем `[System.IO.File] :: ReadAllLines ($ MyPath, [System.Text.Encoding] :: GetEncoding (437))` покрывает ваш _case 3_ (и _case 5_ изменяя `437` на` 1252`) и т. Д. К сожалению, я не знаю, как настроить выходную кодировку `java`… JosefZ 5 лет назад 0
Спасибо за объяснение. Таким образом, виновником является java, а не Powershell? josh21 5 лет назад 0

0 ответов на вопрос

Похожие вопросы