Проблемы с Java/терминалом при получении и распечатке строк в кодировке utf-8JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Проблемы с Java/терминалом при получении и распечатке строк в кодировке utf-8

Сообщение Anonymous »

Я хотел создать чат с поддержкой utf 8, но он не работал только для некоторых конкретных символов utf 8, поэтому, проведя неделю в чистом разочаровании, я сузил вопрос до того, что что-то не так с моим пользовательским вводом обработка, я тоже спросил chatgpt и прочитал бесчисленное количество форумов, но так и не смог понять.
Я использую Windows, я использую vscode, обновленную версию, терминал там использует кодировку utf8, я проверил с помощью chcp - возвращает 65001, то же самое касается cmd, поэтому я не думаю, что это проблема с терминалом, я попробовал перебрать Java System.out в utf-8, это не помогло

Код: Выделить всё

System.setOut(new PrintStream(System.out, true, StandardCharsets.UTF_8));
У меня нет проблем, когда я предварительно установил строку, содержащую символы в кодировке utf8, и распечатал ее
например:

Код: Выделить всё

String random = "háló";
System.out.println(random);
возвращает: háló`

Я пробовал Scanner, BufferedReader, InputStreamReader , конвертируем в байты

Код: Выделить всё

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;

public class Main {
public static void main(String[] args) {
try {
BufferedReader reader = new BufferedReader(
new InputStreamReader(System.in, StandardCharsets.UTF_8)
);
System.out.println("Enter some text (UTF-8 characters supported):");
String userInput = reader.readLine();

// Print the user input to verify
System.out.println("You entered: " + userInput);
byte[] bytes = userInput.getBytes(StandardCharsets.UTF_8);
System.out.println(Arrays.toString(bytes));

} catch (IOException e) {
e.printStackTrace();
}
}
}

возвращает:

Код: Выделить всё

Enter some text (UTF-8 characters supported):
háló
You entered: hl
[104, 0, 108, 0]
примечание: я начинающий Java-разработчик, перешел на Python.
РЕДАКТИРОВАТЬ:
Новые результаты/упоминание ранее пропущенные вещи:
чтобы я мог запустить чат Python до того, как он смог использовать символы в кодировке utf 8 и правильно их распечатать, как я уже упоминал в Java, я тоже смог их распечатать, если я предварительно установил их на переменная, но не тогда, когда я возвращаю их из пользовательского ввода.
Я скачал intellij, опробовал больше терминалов и обнаружил, что он работает правильно в intellij и bash (с подсистемой Windows для Linux) :
Intellij:

Код: Выделить всё

Enter some text (UTF-8 characters supported):
háló
You entered: háló
[104, -61, -95, 108, -61, -77]
bash:

Код: Выделить всё

root@DESKTOP:/mnt/x/javaProjects/UTF 8 SUFFERING# java Main
Enter some text (UTF-8 characters supported):
háló
You entered: háló
[104, -61, -95, 108, -61, -77]
root@DESKTOP:/mnt/x/javaProjects/UTF 8 SUFFERING# java -version
openjdk version "17.0.11" 2024-04-16
OpenJDK Runtime Environment (build 17.0.11+9-Ubuntu-122.04.1)
OpenJDK 64-Bit Server VM (build 17.0.11+9-Ubuntu-122.04.1, mixed mode, sharing)
Интересно, что он печатает другой массив байтов.
Теперь я попробовал cmd, powershell, git bash, терминал vscode, и они не работают.
Я также пробовал разные шрифты, предложенные SedJ601
, и это было интересно, потому что по умолчанию я использовал консоли в cmd, который поддерживает символы utf8 (поэтому он распознавал символы типа «á» и отображал их правильно, но когда Java возвращал его из пользовательский ввод, это не сработало):

Код: Выделить всё

Enter some text (UTF-8 characters supported):
háló
You entered: h l
[104, 0, 108, 0]
но когда я попробовал другой шрифт, например SimSun-ExtB, я получил разные массивы байтов и результаты:

Код: Выделить всё

Enter some text (UTF-8 characters supported):
háló
You entered: h�l�
[104, -17, -65, -67, 108, -17, -65, -67]
Значит, что-то не так с взаимодействием Java и моего терминала.
У меня последняя версия Java.

Код: Выделить всё

X:\javaProjects\UTF 8 SUFFERING>java -version
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
openjdk version "17.0.11"  2024-04-16
OpenJDK Runtime Environment Temurin-17.0.11+9 (build 17.0.11+9)
OpenJDK 64-Bit Server VM Temurin-17.0.11+9 (build 17.0.11+9, mixed mode, sharing)
Я пытался установить переменные среды, но ничего не помогло:

Код: Выделить всё

set JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8
set JAVA_OPTS=-Dfile.encoding=UTF-8
и в Java установлено значение utf 8, так что я еще больше запутался:

Код: Выделить всё

X:\javaProjects\UTF 8 SUFFERING>java -XshowSettings:properties -version
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
Property settings:
file.encoding = UTF-8
Может быть, Java и мои терминалы используют другую таблицу поиска для специальных символов, или я понятия не имею. Я даже сменил локаль системы на свою страну, это тоже не помогло, я понятия не имею, любая помощь будет признательна!

Подробнее здесь: https://stackoverflow.com/questions/786 ... ed-strings
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Пользовательский шрифт при распечатке на терминале [дубликат]
    Anonymous » » в форуме JAVA
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Приложение BGI: удаленный узел не удаляется полностью, возникает ошибка при распечатке.
    Anonymous » » в форуме C++
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Java получает и распечатывает строки в кодировке utf-8
    Anonymous » » в форуме JAVA
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Desktop.ini в кодировке UTF-16LE, созданный Java, не работает, если он содержит китайские символы.
    Anonymous » » в форуме JAVA
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • Изображение в кодировке Base64 частично отображается при декодировании в UTF-8 (вопрос, связанный с AI)
    Anonymous » » в форуме Python
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous

Вернуться в «JAVA»