Тема: Кодування украінською в коді
Console.Write("Фізика: "); Мені видає як "Ф?зика:". Як викрутитись?
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → C#, .NET → Кодування украінською в коді
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися
Console.Write("Фізика: "); Мені видає як "Ф?зика:". Як викрутитись?
Перегляньте цю тему: http://replace.org.ua/topic/3626/
Там можливі дві проблеми - з локаллю та з кодуванням.
Console.Write("Фізика: "); Мені видає як "Ф?зика:". Як викрутитись?
Проблема може бути в шрифті, який використовується в консолі віндовса по замовчуванню. На заголовку вікна натисніть правою клавішою мишки -> "Властивості"/"Properties" -> вкладка "Шрифт"/"Font" -> "Lucida Console" або "Consolas".
Перегляньте цю тему: http://replace.org.ua/topic/3626/
Там можливі дві проблеми - з локаллю та з кодуванням.
Ви дали посилання на C/C++. В C# таких проблем нема.
Локаль і кодування, звичайно, можуть бути причиною, але тільки якщо спеціально їх прописати в коді C#-програми.
А що, C# використовує якусь принципово іншу консоль?
А що, C# використовує якусь принципово іншу консоль?
C# використовує ту саму консоль.
Але в C# по замовчуванню використовується UTF-8, а не cp1251. Тобто :
1) Всі стрічки (екземпляри класу string) по замовчуванню зберігають символи в UTF-8;*
2) Вивід в консоль по замовчуванню відбувається з використанням UTF-8.
*) Ой, трохи попутав. String'и - це колекції символів Char (де кожен займає по 2 байти), тобто кодування там UTF-16. Але суті це не міняє.
А другий пункт таки правда, UTF-8 без BOM.
У випадку Windows, консольні програми можуть здійснювати ввід-вивід двома різними способами: або побайтно (використовуючи поточну кодову сторінку), або використовуючи двобайні символи, минаючи перекодування в байти (це стосується лише вводу/виводу безпосередньо в консоль — при перенаправленні потоків відбувається перекодування в байти відповідно до поточної кодової сторінки). Ну а далі залежить від конкретної реалізації конкретної мови та API, використовуваного програмою. Побайтний підхід більш розповсюджений — так, python або java генерують код, що виводить юнікодівські символи, перекодовуючи їх у байти (тому символи, відсутні в поточній кодовій сторінці, або не відображаються, або викликають помилку перекодування. Java, крім того, не вміє визначати кодову сторінку автоматично й використовує системне ANSI-кодування, яке в українській чи російській локалі відрізняється від консольного за замовчуванням). Тоді як, скажімо, NodeJS одразу працює з юнікодівським вводом-виводом — відповідно, може виводити взагалі будь-які символи, незалежно від того, є вони в поточній кодовій сторінці чи нема (обмеженням може бути лише наявність/відсутність цих символів у консольному шрифті).
... а далі залежить від конкретної реалізації конкретної мови та API, використовуваного програмою.
У C# (і в .NET core) в специфікації прописано, що в char сидить 2 байти, string зберігає їх як UTF-16 (по замовчуванню). А потоки (консоль в C# представлена як об'єкт потоку) по замовчуванню видають UTF-8.
+ пруф
У нода той же підхід: консольний ввід/вивід юнікодівський, при перенаправленні потоків — utf-8.
(Згадані вище python та java також використовують двобайтне внутрішнє представлення символів, але в випадку консольного виводу все одно відбувається перекодування в однобайтне кодування).
Командна оболонка (cmd.exe) також використовує юнікодівський консольний ввід/вивід, але при перенаправленні потоків та роботі з файлами (у т.ч., з батниками) використовується поточна кодова сторінка (і відсутні в ній символи замінюються або на доступні аналоги, або на «?»):
C:\>chcp
Текущая кодовая страница: 866
C:\>echo üнıќôð
üнıќôð
C:\>echo üнıќôð|more
uн??o?
leofun01
Що там в потоках за замовчуванням немає ніякої різниці. Бо в кінці усе одно буде виклик системного API роботи з консоллю. Має значення лише який апі та як викликається. Про що уже зверху написали.
Всі .NET аплікації під вінду використовують mscorlib.dll, а той тягне WinAPI, який дозволяє міняти кодування для виводу в консоль.
Просто залишу тут це
using System;
using System.Text;
class Program {
static void Main(string[] args) {
Console.OutputEncoding = UTF8Encoding.UTF8; // на всякий випадок
Console.Write("Фізика: ");
}
}
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися