Как работать с символами Unicode в Java

JavaJavaBeginner
Практиковаться сейчас

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

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

В этом руководстве мы рассмотрим, как работать с Unicode в Java на практических примерах. Вы узнаете, как представлять символы Unicode в своем коде, манипулировать ими программно и обрабатывать операции ввода и вывода Unicode. К концу этого практического занятия (LabEx) вы сможете уверенно работать с международным текстом в своих Java-приложениях.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL java(("Java")) -.-> java/BasicSyntaxGroup(["Basic Syntax"]) java(("Java")) -.-> java/StringManipulationGroup(["String Manipulation"]) java(("Java")) -.-> java/FileandIOManagementGroup(["File and I/O Management"]) java(("Java")) -.-> java/SystemandDataProcessingGroup(["System and Data Processing"]) java/BasicSyntaxGroup -.-> java/operators("Operators") java/StringManipulationGroup -.-> java/strings("Strings") java/FileandIOManagementGroup -.-> java/files("Files") java/FileandIOManagementGroup -.-> java/io("IO") java/FileandIOManagementGroup -.-> java/nio("NIO") java/SystemandDataProcessingGroup -.-> java/object_methods("Object Methods") java/SystemandDataProcessingGroup -.-> java/string_methods("String Methods") subgraph Lab Skills java/operators -.-> lab-414959{{"Как работать с символами Unicode в Java"}} java/strings -.-> lab-414959{{"Как работать с символами Unicode в Java"}} java/files -.-> lab-414959{{"Как работать с символами Unicode в Java"}} java/io -.-> lab-414959{{"Как работать с символами Unicode в Java"}} java/nio -.-> lab-414959{{"Как работать с символами Unicode в Java"}} java/object_methods -.-> lab-414959{{"Как работать с символами Unicode в Java"}} java/string_methods -.-> lab-414959{{"Как работать с символами Unicode в Java"}} end

Создание вашей первой Java-программы с использованием Unicode

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

Понимание Unicode в Java

Внутри Java используется кодировка UTF-16, что означает, что каждый символ в Java представлен как 16-битный символ Unicode. Это позволяет Java поддерживать широкий спектр международных символов сразу из коробки.

Каждый символ Unicode имеет уникальный кодовую точку (code point), которая представляет собой числовое значение, идентифицирующее символ. Например:

  • Английская буква 'A' имеет кодовую точку U+0041
  • Китайский символ '中' имеет кодовую точку U+4E2D
  • Эмодзи '😀' имеет кодовую точку U+1F600

Создадим простую Java-программу, чтобы продемонстрировать использование символов Unicode.

Создание и запуск программы

  1. Откройте WebIDE и перейдите в терминал. Убедитесь, что вы находитесь в директории /home/labex/project.

  2. Создайте новый Java-файл с именем UnicodeDemo.java с помощью редактора WebIDE. Нажмите на иконку "Explorer" в левой боковой панели, затем на иконку "New File" и дайте ему имя UnicodeDemo.java.

  3. Добавьте следующий код в файл:

public class UnicodeDemo {
    public static void main(String[] args) {
        // Unicode characters from different languages
        String english = "Hello";
        String spanish = "Hola";
        String french = "Bonjour";
        String chinese = "你好";
        String japanese = "こんにちは";
        String arabic = "مرحبا";
        String russian = "Привет";

        // Print all greetings
        System.out.println("English: " + english);
        System.out.println("Spanish: " + spanish);
        System.out.println("French: " + french);
        System.out.println("Chinese: " + chinese);
        System.out.println("Japanese: " + japanese);
        System.out.println("Arabic: " + arabic);
        System.out.println("Russian: " + russian);

        // Print information about a specific character
        char chineseChar = '中';
        System.out.println("\nInformation about the character '" + chineseChar + "':");
        System.out.println("Unicode code point: " + Integer.toHexString(chineseChar | 0x10000).substring(1).toUpperCase());
        System.out.println("Character type: " + Character.getType(chineseChar));
    }
}
  1. Сохраните файл, нажав Ctrl+S или выбрав "File > Save" из меню.

  2. Скомпилируйте и запустите программу, выполнив следующие команды в терминале:

javac UnicodeDemo.java
java UnicodeDemo

Вы должны увидеть вывод, похожий на следующий:

English: Hello
Spanish: Hola
French: Bonjour
Chinese: 你好
Japanese: こんにちは
Arabic: مرحبا
Russian: Привет

Information about the character '中':
Unicode code point: 4E2D
Character type: 5

Понимание вывода

Программа успешно отображает приветствия на различных языках, демонстрируя поддержку Unicode в Java. Значение типа символа "5" соответствует Character.OTHER_LETTER в классе Character Java, что означает, что '中' классифицируется как буква, которая не является ни прописной, ни строчной.

Этот пример показывает, что Java может обрабатывать символы разных письменных систем без какой-либо специальной настройки. Символы Unicode напрямую включаются в исходный код, и Java правильно обрабатывает и отображает их.

Работа с Unicode-управляющими последовательностями

На этом этапе мы узнаем, как представлять символы Unicode с использованием управляющих последовательностей в Java. Это полезно, когда вам нужно включить символы Unicode в ваш код, но вы хотите обеспечить совместимость с текстовыми редакторами или средами, которые могут не поддерживать прямой ввод этих символов.

Unicode-управляющие последовательности

В Java вы можете представить любой символ Unicode, используя управляющую последовательность \u, за которой следует четырехзначный шестнадцатеричный кодовый пункт (code point). Например:

  • \u0041 представляет 'A'
  • \u4E2D представляет '中'

Для символов за пределами Базового многоязычного плана (Basic Multilingual Plane, BMP), которые требуют более 4 шестнадцатеричных цифр, вы можете использовать суррогатные пары или новую синтаксическую конструкцию \u{...} в строковых литералах на Java 12 или более поздней версии.

Создадим новую программу, чтобы продемонстрировать Unicode-управляющие последовательности.

Создание программы

  1. Создайте новый файл с именем UnicodeEscapeDemo.java в директории /home/labex/project.

  2. Добавьте следующий код в файл:

public class UnicodeEscapeDemo {
    public static void main(String[] args) {
        // Unicode escape sequences
        char charA = '\u0041';         // Latin capital 'A'
        char charZ = '\u005A';         // Latin capital 'Z'
        char charCopyright = '\u00A9'; // Copyright symbol ©
        char charEuro = '\u20AC';      // Euro symbol €
        char charChinese = '\u4E2D';   // Chinese character '中'

        System.out.println("Using Unicode escape sequences:");
        System.out.println("\\u0041: " + charA);
        System.out.println("\\u005A: " + charZ);
        System.out.println("\\u00A9: " + charCopyright);
        System.out.println("\\u20AC: " + charEuro);
        System.out.println("\\u4E2D: " + charChinese);

        // Comparing direct characters and escape sequences
        System.out.println("\nComparing direct characters and escape sequences:");
        System.out.println("Direct 'A' == \\u0041: " + ('A' == '\u0041'));
        System.out.println("Direct '©' == \\u00A9: " + ('©' == '\u00A9'));
        System.out.println("Direct '中' == \\u4E2D: " + ('中' == '\u4E2D'));

        // Exploring character properties
        System.out.println("\nExploring properties of Unicode characters:");
        examineCharacter('A');
        examineCharacter('9');
        examineCharacter('©');
        examineCharacter('中');
    }

    private static void examineCharacter(char c) {
        System.out.println("\nCharacter: " + c);
        System.out.println("Unicode code point: \\u" +
            Integer.toHexString(c | 0x10000).substring(1).toUpperCase());
        System.out.println("Is letter? " + Character.isLetter(c));
        System.out.println("Is digit? " + Character.isDigit(c));
        System.out.println("Is whitespace? " + Character.isWhitespace(c));
        System.out.println("Is symbol? " + Character.isISOControl(c));
    }
}
  1. Сохраните файл, нажав Ctrl+S или выбрав "File > Save" из меню.

  2. Скомпилируйте и запустите программу, выполнив следующие команды в терминале:

javac UnicodeEscapeDemo.java
java UnicodeEscapeDemo

Вы должны увидеть вывод, похожий на следующий:

Using Unicode escape sequences:
\u0041: A
\u005A: Z
\u00A9: ©
\u20AC: €
\u4E2D: 中

Comparing direct characters and escape sequences:
Direct 'A' == \u0041: true
Direct '©' == \u00A9: true
Direct '中' == \u4E2D: true

Exploring properties of Unicode characters:

Character: A
Unicode code point: \u0041
Is letter? true
Is digit? false
Is whitespace? false
Is symbol? false

Character: 9
Unicode code point: \u0039
Is letter? false
Is digit? true
Is whitespace? false
Is symbol? false

Character: ©
Unicode code point: \u00A9
Is letter? false
Is digit? false
Is whitespace? false
Is symbol? false

Character: 中
Unicode code point: \u4E2D
Is letter? true
Is digit? false
Is whitespace? false
Is symbol? false

Понимание кода

Эта программа демонстрирует несколько важных концепций:

  1. Unicode-управляющие последовательности: Мы определяем символы, используя их Unicode-управляющие последовательности (\uXXXX).

  2. Равенство символов: Программа показывает, что символ, определенный напрямую ('A'), идентичен тому же символу, определенному с использованием управляющей последовательности ('\u0041').

  3. Свойства символов: Метод examineCharacter использует класс Character для проверки свойств различных символов Unicode, таких как то, являются ли они буквами, цифрами или пробелами.

Использование Unicode-управляющих последовательностей особенно полезно, когда:

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

Чтение и запись Unicode в файлы

На этом этапе мы узнаем, как читать и записывать символы Unicode в файлы. Правильная обработка кодировок символов является важной частью работы с файлами, особенно при работе с международным текстом.

Понимание кодировок символов

При записи текста в файл или чтении его из файла необходимо указать кодировку символов. Самой распространенной и рекомендуемой кодировкой для текста Unicode является UTF-8.

  • UTF-8 - это кодировка переменной длины, которая может представить все символы Unicode.
  • Она обратно совместима с ASCII.
  • Это кодировка по умолчанию для HTML, XML и многих современных систем.

Java предоставляет класс java.nio.charset.StandardCharsets, который содержит константы для стандартных наборов символов, таких как UTF-8, UTF-16 и ISO-8859-1.

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

Создание записи Unicode в файл

  1. Создайте новый файл с именем UnicodeFileDemo.java в директории /home/labex/project.

  2. Добавьте следующий код в файл:

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.*;
import java.util.*;

public class UnicodeFileDemo {
    private static final String FILE_PATH = "unicode_sample.txt";

    public static void main(String[] args) {
        try {
            // Create a list of greetings in different languages
            List<String> greetings = Arrays.asList(
                "English: Hello, World!",
                "Spanish: ¡Hola, Mundo!",
                "French: Bonjour, le Monde!",
                "German: Hallo, Welt!",
                "Chinese: 你好,世界!",
                "Japanese: こんにちは、世界!",
                "Arabic: مرحبا بالعالم!",
                "Russian: Привет, мир!",
                "Greek: Γειά σου, Κόσμε!",
                "Hindi: नमस्ते, दुनिया!",
                "Emoji: 👋🌍!"
            );

            // Write greetings to file
            writeToFile(greetings);
            System.out.println("Successfully wrote Unicode text to " + FILE_PATH);

            // Read and display file contents
            List<String> readLines = readFromFile();
            System.out.println("\nFile contents:");
            for (String line : readLines) {
                System.out.println(line);
            }

            // Display encoding information
            System.out.println("\nEncoding information:");
            System.out.println("Default charset: " + System.getProperty("file.encoding"));
            System.out.println("Is UTF-8 supported? " + StandardCharsets.UTF_8.canEncode());

        } catch (IOException e) {
            System.err.println("Error processing the file: " + e.getMessage());
            e.printStackTrace();
        }
    }

    private static void writeToFile(List<String> lines) throws IOException {
        // Write using Files class with UTF-8 encoding
        Files.write(Paths.get(FILE_PATH), lines, StandardCharsets.UTF_8);
    }

    private static List<String> readFromFile() throws IOException {
        // Read using Files class with UTF-8 encoding
        return Files.readAllLines(Paths.get(FILE_PATH), StandardCharsets.UTF_8);
    }
}
  1. Сохраните файл, нажав Ctrl+S или выбрав "File > Save" из меню.

  2. Скомпилируйте и запустите программу, выполнив следующие команды в терминале:

javac UnicodeFileDemo.java
java UnicodeFileDemo

Вы должны увидеть вывод, похожий на следующий:

Successfully wrote Unicode text to unicode_sample.txt

File contents:
English: Hello, World!
Spanish: ¡Hola, Mundo!
French: Bonjour, le Monde!
German: Hallo, Welt!
Chinese: 你好,世界!
Japanese: こんにちは、世界!
Arabic: مرحبا بالعالم!
Russian: Привет, мир!
Greek: Γειά σου, Κόσμε!
Hindi: नमस्ते, दुनिया!
Emoji: 👋🌍!

Encoding information:
Default charset: UTF-8
Is UTF-8 supported? true

Проверка выходного файла

Давайте посмотрим на файл, который мы создали:

  1. Используйте проводник файлов WebIDE, чтобы открыть файл unicode_sample.txt, который был создан в директории /home/labex/project.

  2. Вы должны увидеть все приветствия на разных языках, правильно отображающиеся с их символами Unicode.

Понимание кода

Эта программа демонстрирует несколько ключевых аспектов работы с Unicode в файлах:

  1. Явное указание кодировки: Мы явно указываем кодировку UTF-8 при записи в файл и чтении из него с использованием StandardCharsets.UTF_8. Это гарантирует, что символы Unicode будут правильно сохранены.

  2. Современный ввод-вывод файлов: Мы используем класс java.nio.file.Files, который предоставляет удобные методы для чтения и записи файлов с определенной кодировкой символов.

  3. Кодировка по умолчанию: Программа отображает кодировку символов по умолчанию системы, которая может отличаться в зависимости от операционной системы и настроек локали.

  4. Поддержка эмодзи: Программа включает пример эмодзи (👋🌍), чтобы показать, что Java и UTF-8 могут обрабатывать символы из дополнительных плоскостей Unicode.

При работе с Unicode в файлах всегда помните:

  • Явно указывайте кодировку (предпочтительно UTF-8).
  • Используйте одну и ту же кодировку для чтения и записи.
  • Обрабатывайте возможные IOException, которые могут возникнуть во время операций с файлами.
  • Будьте осведомлены о кодировке по умолчанию системы, но не полагайтесь на нее.

Резюме

В этом руководстве вы узнали основные аспекты работы с символами Unicode в Java. Вот краткий обзор того, что вы достигли:

  1. Основы Unicode: Вы создали простую Java-программу, которая отображает текст на нескольких языках, демонстрируя встроенную поддержку Unicode в Java.

  2. Unicode-управляющие последовательности: Вы научились использовать Unicode-управляющие последовательности (\uXXXX) для представления символов и исследовали свойства различных типов символов Unicode.

  3. Ввод-вывод файлов с использованием Unicode: Вы реализовали программу, которая читает и записывает текст Unicode в файлы, обеспечивая правильную кодировку символов с использованием UTF-8.

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

Некоторые важные выводы из этого руководства:

  • Java внутренне использует кодировку UTF-16 для своего типа char.
  • Символы Unicode могут быть представлены напрямую или с использованием управляющих последовательностей.
  • Всегда указывайте кодировку (предпочтительно UTF-8) при чтении из файла или записи в него.
  • Класс Character предоставляет методы для исследования свойств символов Unicode.
  • Современный пакет NIO в Java (java.nio) обеспечивает надежную поддержку работы с Unicode в файлах.

Обладая этими знаниями, вы можете уверенно создавать Java-приложения, которые без проблем работают с текстом на любом языке.