Как распечатать смайлы с помощью Pascal в Windows cmd/powershell

Согласно этой таблице код UTF8 для смайлика-эмодзи: F0 9F 98 81.

Я пытаюсь записать этот вывод в консоль, но безрезультатно:

Program emojii;

{$apptype CONSOLE}

Begin
  WriteLn(#$F0#$9F#$98#$81);
End.

В ответ я получаю жаргонизм: ≡ƒÿü

Я использую Windows Terminal Powershell, который поддерживает смайлы, как показано на изображении ниже:

Я использую FreePascal: Free Pascal Compiler version 3.2.2 [2024/02/26] for x86_64. Я создаю с помощью следующей команды:

fpc emojii.pas

Отвечает ли это на ваш вопрос? Диакритические знаки в консольном приложении Pascal?

Kai Burghardt 05.04.2024 23:03

@KaiBurghardt нет. Я разобрался и оставил ответ.

BugHunterUK 06.04.2024 20:44
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
132
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ваша программа на Паскале и ее результат в порядке.

Измените глобальные настройки кодировки Windows или настройки оболочки, чтобы использовать кодировку utf-8. Изменение кодировки вывода PowerShell по умолчанию на UTF-8.

Если ваша кодировка отличается и вы должны поддерживать эту кодировку, вам необходимо изменить свой код. К сожалению, у меня нет компьютера M$ с Windows. Но ваши коды смайликов можно записать так:

  • UTF-8: $F0 $9F $98 $81 (шестнадцатеричный)
  • UTF-8: &360 &237 &230 &201 (восьмеричный)
  • UTF-16: $D83D $DE01 (шестнадцатеричный)
  • UTF-32: $1F601 (шестнадцатеричный)

Я понял, что Windows использует UCS4, поэтому мне пришлось использовать SetConsoleOutputCP(CP_UTF8).

BugHunterUK 06.04.2024 09:33

Извините, я имел в виду cmd, а Powershell по умолчанию использует кодовую страницу 437. Не смог отредактировать предыдущий комментарий.

BugHunterUK 06.04.2024 20:15

@BugHunterUK Вы всегда можете удалить свои комментарии и добавить новые — нет необходимости вечно хранить неправильный комментарий. Удалите как публикацию, так и новый правильный комментарий.

AmigoJack 07.04.2024 04:46

«Хватит комментировать», — комментирует спамер комментариев. Довольно иронично, @BugHunterUK.

AmigoJack 08.04.2024 11:23
Ответ принят как подходящий

По умолчанию Windows CMD и Powershell используют кодовую страницу 437, которая не поддерживает смайлы.

Решение состоит в том, чтобы использовать SetConsoleOutputCP(CP_UTF8) для изменения кодовой страницы консоли на UTF8.

Ниже я привел пример с использованием кодовых точек UTF8 и UTF16.

Program Emoji;

{$APPTYPE CONSOLE}

uses
  Windows;
  
Var
  U8Emoji: String;
  U16Emoji: WideString;
  Converted: String;
Begin
  // 😁 emoji UTF8 and UTF16 codepoints
  U8Emoji := Char($F0) + Char($9F) + Char($98) + Char($81);
  U16Emoji := WideChar($D83D) + WideChar($DE01);
  
  // Convert UTF16 to UTF8
  Converted := UTF8Encode(U16Emoji);

  // Set the Windows console codepage to UTF8. By default CMD and Powershell
  // use code page 437: https://en.wikipedia.org/wiki/Code_page_437
  SetConsoleOutputCP(CP_UTF8);  

  // Prints 😁 emoji 
  WriteLn(U8Emoji);
  WriteLn(Converted);
End.

Вам понадобится шрифт, поддерживающий смайлы. В Windows 11 по умолчанию используется шрифт Segoe UI Emoji.

Это всего лишь личный опыт, и он может сильно различаться в других средах - нет никакой гарантии, что консоль использует шрифт или несколько шрифтов для отображения всех графем (которые различаются в зависимости от версии Windows), и нет никакой гарантии, что каждый пользователь не установил другое значение по умолчанию. Попробуйте комбинированных персонажей и откройте для себя пределы. Имена собственные: UTF-8 и UTF-16 (с дефисом) и emoji (один i).

AmigoJack 07.04.2024 04:44

Другие вопросы по теме