Используйте Get-Content в PowerShell в качестве входных данных Java, чтобы получить дополнительный символ - PullRequest
1 голос
/ 02 апреля 2019

Я практикую использовать командную строку для запуска java-скрипта в windows 10. java-скрипт использует scanner(System.in) для получения ввода из файла и печати строки, которую он получает из файла. Команда powershell выглядит следующим образом:

Get-Content source.txt | java test.TestPrint

Содержимое файла source.txt выглядит следующим образом:

:
a
2
!

И файл TestPrint.java выглядит следующим образом:

package test;

import java.util.Scanner;

public class TestPrint {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner in = new Scanner(System.in);

        while(in.hasNextLine())
        {
            String str = in.nextLine();
            if(str.equals("q")) break;
            System.out.println( str );          
        }
    }

}

Тогда странная вещь произошла. Результат

?:
a
2
!

Вы видите, это добавляет вопросительный знак в начало первой строки. Затем, когда я изменяю символ в первой строке файла source.txt с ":" на "a", результат будет

 a
a
2
!

Добавляет пробел в начале первой строки.

Я проверил символ и обнаружил закономерность: если символ больше, чем "?" в ASCII, который равен 63 в ASCII, то он добавит пробел, такой как "A" (65 в ASCII) или "[" (91 в ASCII). Если символ меньше, чем «?», Включая «?» Сам добавит знак вопроса.

Ответы [ 2 ]

1 голос
/ 02 апреля 2019

Может ли это быть проблемой Unicode (См .: Проблемы Java Unicode )?то есть попробуйте указать тип, который вы хотите прочитать:

Scanner in = new Scanner(System.in, "UTF-8");

РЕДАКТИРОВАТЬ:

При дальнейшем исследовании, PowerShell 5.1 и более ранних версий, кодовая страница по умолчанию Windows-1252.PowerShell 6+ и кроссплатформенные версии перешли на UTF-8.Поэтому (из комментариев) вам может потребоваться указать кодировку Windows-1252:

Scanner in = new Scanner(System.in, "Windows-1252");

Чтобы узнать, какая кодировка используется, выполните в PowerShell следующее:

[System.Text.Encoding]::Default

Ивы должны увидеть, какая кодировка используется (для меня в PowerShell v 5.1 это была Windows-1252, для PowerShell 6 - UTF-8).

0 голосов
/ 04 апреля 2019

Нет текста, кроме закодированного текста.

Каждая программа, читающая текстовый файл или поток, должна знать и использовать ту же кодировку символов, что и писатель.

Адаптивная кодировка символов по умолчанию является решением 90-х годов для проблемы 70-х и 80-х годов (приблизительно).Сегодня обычно лучше избегать конструкторов и методов, которые используют значение по умолчанию, и в PowerShell добавьте аргумент кодирования, где это необходимо для управления вводом или выводом.

Чтобы предотвратить потерю данных, вы можете использовать набор символов Юникод повсюду.UTF-8 является наиболее распространенным для файлов и потоков.(PowerShell и Java используют UTF-16 для текстовых типов данных.)

Но вам нужно начать с того, что вы знаете, какова кодировка символов текстового файла.Если вы не знаете эти метаданные, это потеря данных прямо здесь.

Юникод предусматривает, что если известно, что файл или поток является Юникодом, он может начинаться с метаданных, называемых спецификацией.Спецификация указывает, какая конкретная кодировка символов Unicode используется и каков порядок байтов (для кодировок символов с единицами кода длиннее, чем байт).[Это положение не решает никаких проблем, с которыми я сталкивался, и вызывает собственные проблемы.]

(Кодировка символов на абстрактном уровне представляет собой карту между кодовыми точками и единицами кода и поэтому независимапорядка байтов. На практике кодирование символов выполняет дополнительный этап сериализации / десериализации блоков кода в / из байтовых последовательностей. Таким образом, иногда использование или отсутствие использования спецификации входит в название или описание кодировки. Также может быть указана спецификацияв качестве подписи. Ergo, "UTF-8 с подписью.")

В качестве метаданных, при необходимости, следует использовать спецификацию, если она присутствует, и всегда отбрасывать при вводе текста в текстовые типы данных.К сожалению, стандартные библиотеки Java не сбрасывают спецификацию.Для этого вы можете использовать популярные библиотеки или около десятка строк собственного кода.

Опять же, начните с знания кодировки символов текстового файла и вставки этих метаданных в обработку в качестве аргумента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...