1

Тема: Кодування украінською в коді

Console.Write("Фізика: "); Мені видає як "Ф?зика:". Як викрутитись?

2

Re: Кодування украінською в коді

Перегляньте цю тему: http://replace.org.ua/topic/3626/
Там можливі дві проблеми - з локаллю та з кодуванням.

3

Re: Кодування украінською в коді

Maxrad20 написав:

Console.Write("Фізика: "); Мені видає як "Ф?зика:". Як викрутитись?

Проблема може бути в шрифті, який використовується в консолі віндовса по замовчуванню. На заголовку вікна натисніть правою клавішою мишки -> "Властивості"/"Properties" -> вкладка "Шрифт"/"Font" -> "Lucida Console" або "Consolas".

koala написав:

Перегляньте цю тему: http://replace.org.ua/topic/3626/
Там можливі дві проблеми - з локаллю та з кодуванням.

Ви дали посилання на C/C++. В C# таких проблем нема.
Локаль і кодування, звичайно, можуть бути причиною, але тільки якщо спеціально їх прописати в коді C#-програми.

4

Re: Кодування украінською в коді

А що, C# використовує якусь принципово іншу консоль?

Подякували: leofun011

5 Востаннє редагувалося leofun01 (05.10.2018 19:28:28)

Re: Кодування украінською в коді

koala написав:

А що, C# використовує якусь принципово іншу консоль?

C# використовує ту саму консоль.
Але в C# по замовчуванню використовується UTF-8, а не cp1251. Тобто :
1) Всі стрічки (екземпляри класу string) по замовчуванню зберігають символи в UTF-8;*
2) Вивід в консоль по замовчуванню відбувається з використанням UTF-8.

*) Ой, трохи попутав. String'и - це колекції символів Char (де кожен займає по 2 байти), тобто кодування там UTF-16. Але суті це не міняє.

А другий пункт таки правда, UTF-8 без BOM.

6

Re: Кодування украінською в коді

У випадку Windows, консольні програми можуть здійснювати ввід-вивід двома різними способами: або побайтно (використовуючи поточну кодову сторінку), або використовуючи двобайні символи, минаючи перекодування в байти (це стосується лише вводу/виводу безпосередньо в консоль — при перенаправленні потоків відбувається перекодування в байти відповідно до поточної кодової сторінки). Ну а далі залежить від конкретної реалізації конкретної мови та API, використовуваного програмою. Побайтний підхід більш розповсюджений — так, python або java генерують код, що виводить юнікодівські символи, перекодовуючи їх у байти (тому символи, відсутні в поточній кодовій сторінці, або не відображаються, або викликають помилку перекодування. Java, крім того, не вміє визначати кодову сторінку автоматично й використовує системне ANSI-кодування, яке в українській чи російській локалі відрізняється від консольного за замовчуванням). Тоді як, скажімо, NodeJS одразу працює з юнікодівським вводом-виводом — відповідно, може виводити взагалі будь-які символи, незалежно від того, є вони в поточній кодовій сторінці чи нема (обмеженням може бути лише наявність/відсутність цих символів у консольному шрифті).

Подякували: leofun01, Torbins2

7 Востаннє редагувалося leofun01 (05.10.2018 19:48:05)

Re: Кодування украінською в коді

P.Y. написав:

... а далі залежить від конкретної реалізації конкретної мови та API, використовуваного програмою.

У C# (і в .NET core) в специфікації прописано, що в char сидить 2 байти, string зберігає їх як UTF-16 (по замовчуванню). А потоки (консоль в C# представлена як об'єкт потоку) по замовчуванню видають UTF-8.

+ пруф

Подякували: P.Y.1

8 Востаннє редагувалося P.Y. (05.10.2018 20:10:17)

Re: Кодування украінською в коді

У нода той же підхід: консольний ввід/вивід юнікодівський, при перенаправленні потоків — utf-8.
(Згадані вище python та java також використовують двобайтне внутрішнє представлення символів, але в випадку консольного виводу все одно відбувається перекодування в однобайтне кодування).

Командна оболонка (cmd.exe) також використовує юнікодівський консольний ввід/вивід, але при перенаправленні потоків та роботі з файлами (у т.ч., з батниками) використовується поточна кодова сторінка (і відсутні в ній символи замінюються або на доступні аналоги, або на «?»):

C:\>chcp
Текущая кодовая страница: 866

C:\>echo üнıќôð
üнıќôð

C:\>echo üнıќôð|more
uн??o?
Подякували: leofun011

9

Re: Кодування украінською в коді

leofun01
Що там в потоках за замовчуванням немає ніякої різниці. Бо в кінці усе одно буде виклик системного API роботи з консоллю. Має значення лише який апі та як викликається. Про що уже зверху написали.

Подякували: leofun011

10

Re: Кодування украінською в коді

Всі .NET аплікації під вінду використовують mscorlib.dll, а той тягне WinAPI, який дозволяє міняти кодування для виводу в консоль.
Просто залишу тут це

using System;
using System.Text;

class Program {
    static void Main(string[] args) {
        Console.OutputEncoding = UTF8Encoding.UTF8; // на всякий випадок
        Console.Write("Фізика: ");
    }
}

https://replace.org.ua/misc.php?action=pun_attachment&item=1908&download=0

Post's attachments

CsharpUTF8encoding.png 1.45 kb, 103 downloads since 2018-10-06 

Подякували: FakiNyan, Maxrad202