Отображение символа евро с использованием юникода и изменением символов на верхний регистр

Я должен выполнить это с помощью Java

Часть 1. Выведите 188 евро, используя примитивный тип данных character . Используйте Unicode для символа евро €

Часть 2. Измените следующие символьные переменные «j’’o’’e» на JOE в верхнем регистре и выведите результат.

Я использовал этот код, я что-то упустил?

public class Test27 {

    public static void main (String args[]){
    System.out.println("\u20ac" +"188");

    String changeCase= "joe";

    String result;
    result=changeCase.toUpperCase();

    System.out.println( result);        
    }
}

Ваше здоровье


person Dan Wyer    schedule 18.06.2013    source источник
comment
Что происходит, когда вы компилируете/запускаете его? В последнее время я мало использовал Java, но мне кажется, что это нормально... В чем проблема?   -  person James Green    schedule 18.06.2013
comment
Кроме стиля ничего. Пространства — хорошая идея, но их можно было бы разместить более систематически. changeCase нельзя однозначно идентифицировать как существительное, например mixedCase или littleJoe. Переменная Char не звучит как String.   -  person Joop Eggen    schedule 18.06.2013
comment
В задании сказано использовать примитивные типы данных char, а не String. Так что это будет '\u20AC' + "188", System.out.print(Character.toUpperCase('j')) и т. д.   -  person erickson    schedule 18.06.2013
comment
Это ужасное задание для новичка — вывести текст в формате, отличном от ASCII, в терминал сложно и ненадежно по причинам, которые не имеют ничего общего с программированием на Java, а связаны со сломанными платформами, согласно @ ответ Эндрюта.   -  person bobince    schedule 19.06.2013
comment
Спасибо, Эриксон, я думаю, это была моя проблема.   -  person Dan Wyer    schedule 19.06.2013


Ответы (2)


Если вопрос касается только искажения знака евро, т. е. программы

import java.io.*;

public class Foo {

    public static void main (String args[])
        throws Exception
    {
        System.out.println("\u20ac");
    }
}

Затем сначала вы должны прочитать Абсолютный минимум, который обязательно должен знать каждый разработчик программного обеспечения о Unicode и наборах символов. (Никаких оправданий!).

Затем вам нужно сделать так, чтобы кодировка, которую отправляет Java, соответствовала кодировке, ожидаемой вещью, отображающей вывод Java. Я предполагаю, что вы работаете в командной строке.

  • В Linux это должно просто работать. Все в UTF-8 по умолчанию.

  • На Mac в Terminal.app это не сработает, потому что по какой-то безумной причине кодировка текста по умолчанию для Java — это древний набор символов MacRoman, в котором нет евро. Но Terminal.app полностью поддерживает UTF-8. Технически вы можете отключить это в «Терминал» → «Настройки» → «Настройки» → «Дополнительно» → «Международные», но по умолчанию это UTF-8.

    Чтобы настроить java для использования вывода UTF-8, вы можете передать аргумент командной строки

    java -Dfile.encoding=UTF-8 Foo
    

    Но это работает только в том случае, если вы можете контролировать запуск своей программы. Если вы отправляете файлы JAR или .class для запуска другим, это не сработает. Вы можете настроить кодировку самостоятельно, создав объект, который будет писать в System.out с другой кодировкой:

    import java.io.*;
    
    public class Foo {
    
        public static void main (String args[])
            throws Exception
        {
            PrintWriter out = new PrintWriter(
                new OutputStreamWriter(System.out, "UTF-8"), true);
    
            out.println("\u20ac");
        }
    }
    

    Пока вы не забываете всегда использовать новую переменную out для печати вместо System.out.

  • В Windows это становится более сумасшедшим. Кодировка по умолчанию в командной строке различается в разных языковых версиях Windows. В английской версии Windows это Cp850. В русской Windows это Cp866. Как и символ евро! Вы можете изменить кодировку с помощью команды chcp, но даже если вы измените ее на кодировку с символом евро, шрифт командной строки по умолчанию не будет иметь символ евро!

    Возможно, вы сможете определить с помощью Java, что вы работаете в командной строке Windows, программно изменить кодировку и шрифт, а затем вывести свою строку, но это много работы. Вам, вероятно, лучше просто использовать приведенный выше код для принудительного вывода UTF-8 и включить в свой код инструкции, которые, если он должен запускаться в командной строке Windows, пользователю сначала потребуется:

    1. Run chcp 65001 to switch the command prompt encoding to UTF-8
    2. Переключите шрифт на консоль Lucida, щелкнув значок в верхнем левом углу, выбрав «Свойства» и перейдя на вкладку «Шрифт».

    Чтобы упростить вам задачу, но повысить вероятность того, что написанный вами код будет работать только на вашем компьютере, вы также можете изменить значение по умолчанию кодовую страницу командной строки в UTF-8.

введите здесь описание изображениявведите здесь описание изображения

person andrewdotn    schedule 18.06.2013
comment
Обратите внимание, что в среде выполнения MS C есть серьезные ошибки, когда для кодовой страницы установлено значение 65001, что может привести к зависанию или непоследовательному поведению Java и других приложений. Так что работать на 65001 для всего и вся не очень хорошая идея. К сожалению, UTF-8 является гражданином второго сорта в Windows. - person bobince; 19.06.2013
comment
Большое спасибо, проблем с выводом не было, это была путаница с Char и String, он выводил 188 евро в порядке, я просто не был уверен, соответствует ли код спецификациям, ура! - person Dan Wyer; 19.06.2013
comment
В качестве альтернативы кодовой странице 65001 также 858 (также известная как IBM00858: OEM Multilingual Latin 1 + символ евро) имеет символ €. - person user1708042; 04.02.2015

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

person erickson    schedule 18.06.2013
comment
Этот ответ гораздо более зрелый. Теперь мы знаем, кто эксперт, а кто нет. - person Al Kasih; 18.05.2020