Кодировка UTF-8 свойств Java в Eclipse

Другой альтернативой является создание полноценного модуля PowerShell. Вот быстрый способ сделать это:

  1. Создать новое решение для библиотеки классов
  2. NuGet в Microsoft.PowerShell.5.ReferenceAssemblies
  3. Создать простой класс POCO (просто как демо) ) like:

Класс My Greeting:

public class GreetingClass
{
    public string Greeting { get; set; }
    public string ToWhom { get; set; }
}
  1. Затем создайте класс Cmdlet, который наследуется от System.Management.Automation.Cmdlet и поставляется с несколькими атрибутами PowerShell: [ 1128]

Вот мое:

[Cmdlet(VerbsCommon.New, "Greeting")]
[OutputType(typeof(GreetingClass))]
public class NewGreeting : Cmdlet
{
    [Parameter(Mandatory = true)]
    public string Greeting { get; set; }

    [Parameter]
    [Alias("Who")]
    public string ToWhom { get; set; } = "World";

    protected override void ProcessRecord()
    {
        base.ProcessRecord();

        WriteVerbose("Creating and returning the Greeting Object");
        var greeting = new GreetingClass {Greeting = Greeting, ToWhom = ToWhom};
        WriteObject(greeting);
    }
}
  1. Чтобы отладить его, откройте свойства проекта вкладки Debug и установите:
    • Запустите внешнюю программу: C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
    • Аргументы командной строки: -noprofile -noexit -command "import-module .\yourProjectName.dll

Теперь нажмите F5. Появится консоль PowerShell. Поскольку вы импортировали свой модуль, командлет New-Greeting загружен. Итак, все это работает:

PS C:\> New-Greeting -Greeting "hello there" -ToWhom World

, что приводит к:

Greeting    ToWhom
--------    ------
hello there World

Но ваш командлет является полноценным командлетом PowerShell, поэтому он может попасть в конвейер. Это:

PS C:\> New-Greeting -Greeting "What's new" -ToWhom Pussycat | Format-List

приведет к:

Greeting : What's new
ToWhom   : Pussycat

Поскольку вы запускаете сеанс PowerShell, когда нажимаете F5 и загружаете свой модуль, вы можете установить точки останова в своем коде, одношаговый и т. д. в отладчике.

Вы получаете все обычное совершенство PowerShell. Вы можете использовать -Who как псевдоним для -ToWhom. Параметр -Greeting описывается как обязательный, поэтому, если вы его забудете, консоль предложит вам.

Вы также можете предоставлять методы в своем классе POCO. Например, если вы добавите этот метод в GreetingClass:

public void SayHello()
{
    Console.WriteLine($"{Greeting} {ToWhom}");
}

Вы можете сделать это в PowerShell:

PS C:\> $greet = New-Greeting -Greeting Hello -Who World
PS C:\> $greet.SayHello()

и получить в результате:

[ 118]

Я многому научился из этого: https://www.red-gate.com/simple-talk/dotnet/net-development/using-c-to-create-powershell-cmdlets- the-basics /

Вы автоматически получаете базовую помощь Get-Help из PowerShell, но если вы будете следовать демонстрациям Red-Gate (по ссылке выше), вы узнаете, как разбогатеть Get-Help Справка из стандартных комментариев C # XML (из пакета XmlDoc2CmdletDoc NuGet).

48
задан BuZZ-dEE 2 June 2015 в 23:38
поделиться

6 ответов

Не тратьте зря время, вы можете использовать плагин Resource Bundle в Eclipse

Basic Screen Shot

Старая страница Sourceforge

54
ответ дан 7 November 2019 в 12:05
поделиться

Это не проблема с Eclipse. Если вы используете класс Properties для чтения и сохранения файла свойств, класс будет экранировать все специальные символы.

Из документации класса:

При сохранении свойств в поток или их загрузке из потока, ISO 8859 Используется кодировка -1 символов. Для символов, которые не могут быть напрямую представлены в этой кодировке, используются escape-символы Unicode; однако в escape-последовательности допускается только один символ «u». Инструмент native2ascii можно использовать для преобразования файлов свойств в другие кодировки символов и обратно.

Из API, метод store ():

Символы меньше \ u0020 и символы больше \ u007E записываются как \ uxxxx для соответствующего шестнадцатеричного значения xxxx.

12
ответ дан 7 November 2019 в 12:05
поделиться

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

EF BF BD - это кодированная в UTF-8 форма U + FFFD , стандартный заменяющий символ, который вставляется декодерами при обнаружении искаженного ввода. Похоже, ваш текст сохраняется как ISO-8859-1, затем читается как UTF-8, затем сохраняется как UTF-8, а затем конвертируется в формат свойств с использованием native2ascii с использованием платформы по умолчанию. кодировка (например, windows-1252).

ü              => 0xFC                // save as ISO-8859-1
0xFC           => U+FFFD              // read as UTF-8
U+FFFD         => 0xEF 0xBF 0xBD      // save as UTF-8
0xEF 0xBF 0xBD => \u00EF\u00BF\u00BD  // native2ascii

Я предлагаю вам оставить свойство "file.encoding" в покое. Подобно "file.separator" и "line.separator", это далеко не так полезно, как вы ожидали бы. Вместо,

4
ответ дан 7 November 2019 в 12:05
поделиться

Файлы свойств по определению являются ISO-8859-1 - см. Документацию по классу Properties .

Spring имеет замену, которая может загружаться с указанной кодировкой, с использованием PropertiesFactoryBean .

РЕДАКТИРОВАТЬ: Как отметил в комментариях Лоуренс, Java 1.6 представила перегрузки для load и store , которые используют Reader ] / Автор . Это означает, что вы можете создать программу чтения для файла с любой кодировкой, которую хотите, и передать его в load . К сожалению, FileReader по-прежнему не позволяет вам указать кодировку в конструкторе (aargh), поэтому вы застрянете в цепочке FileInputStream и InputStreamReader вместе , Однако это сработает.

Например, для чтения файла с использованием UTF-8:

Properties properties = new Properties();
InputStream inputStream = new FileInputStream("path/to/file");
try {
    Reader reader = new InputStreamReader(inputStream, "UTF-8");
    try {
        properties.load(reader);
    } finally {
        reader.close();
    }
} finally {
   inputStream.close();
}
64
ответ дан 7 November 2019 в 12:05
поделиться

Кажется, это работает только для некоторых символов ... включая специальные символы для немецкого, португальского и французского языков. Однако у меня возникли проблемы с русскими, хинди и мандаринскими символами. Они не преобразуются в формат свойств native2ascii, вместо этого сохраняются с помощью ?? ?? ??
Единственный способ заставить мое приложение правильно отображать эти символы - это поместить их в файл свойств, переведенный в формат UTF-8 - как \ u0915 вместо क или \ u044F вместо я. Есть какие-нибудь советы?

1
ответ дан 7 November 2019 в 12:05
поделиться
Properties props = new Properties();
URL resource = getClass().getClassLoader().getResource("data.properties");         
props.load(new InputStreamReader(resource.openStream(), "UTF8"));

Работает как шарм

: -)

10
ответ дан 7 November 2019 в 12:05
поделиться
Другие вопросы по тегам:

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