powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / Windows [игнор отключен] [закрыт для гостей] / UTF-8 в консоли
17 сообщений из 17, страница 1 из 1
UTF-8 в консоли
    #40029189
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне нужно использовать консольную утилиту (sqlplus от Oracle) на ПК с Windows.
Хотелось бы использовать юникод.
Сделал так.

Вызываемый значок:
%windir%\system32\cmd.exe /U /C C:\Oracle\connect.bat
(в свойствах значка выбран шрифт Consolas)

Файл connect.bat:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
@chcp 65001
@echo off
set ORACLE_HOME=C:\Oracle
set TNS_ADMIN=C:\Oracle
set NLS_LANG=RUSSIAN_CIS.UTF8
set NLS_DATE_FORMAT=YYYY-MM-DD HH24:MI:SS
set NLS_NUMERIC_CHARACTERS=.,
set LANG=ru_RU.UTF-8
sqlplus ...
pause

Работает почти все, но если первым символом в строке идет строчная русская буква, то она портится:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Active code page: 65001

SQL*Plus: Release 12.1.0.2.0 Production on Пт Дек 18 23:53:35 2020

Copyright (c) 1982, 2014, Oracle.  All rights reserved.


��рисоединен к:
Oracle Database 10g Release 10.2.0.4.0 - 64bit Production

SQL> select NAME from BM_TARIFF where TARIFF_ID = 4893;

��троки не выбраны

Ну и на входе кириллица читается с перебоями (искажается).

Если же кодировку оставить CP866, тогда с кириллицей все нормально, но в БД в некоторых местах используются юникодные символы и в CP866 они пропадают.
...
Рейтинг: 0 / 0
UTF-8 в консоли
    #40029218
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообщем это невозможно в cmd, во всяком случае в Windows 7. В консоли используется UCS-2, а UTF-8 работает через какие-то костыли. Кроме того, вход в любом случае не юникодный.
Поставил msys2, запускаю клиента из него.
...
Рейтинг: 0 / 0
UTF-8 в консоли
    #40029286
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

а при чём здесь cmd ?

Во-первых, непонятно зачем использовать в качестве связки неудачную корявую поделку 90-х годов прошлого века ?
( это про cmd.exe )

А, во-вторых, показанные артефакты с корявым изображением некоторых юникодных символов в консоли не имеют к cmd.exe
никакого отношения, это так работает утилита sqlplus.exe, а, точнее, если копнуть вглубь,
так работает "C" RTL ввода-вывода этой и многих других консольных сишных утилит.

Если хотите получить внешне корректный ввод/вывод юникода в стареньком терминале Windows ( новый доступен только в Windows 10 ), то ваше приложение должно пользоваться консольным Win32 API, а не "C" RTL.
...
Рейтинг: 0 / 0
UTF-8 в консоли
    #40029297
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
volodin661Во-первых, непонятно зачем использовать в качестве связки неудачную корявую поделку 90-х
годов прошлого века ?

А что, в PowerShell работа с вводом/выводом UTF-8 лучше?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
UTF-8 в консоли
    #40029310
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
volodin661

А, во-вторых, показанные артефакты с корявым изображением некоторых юникодных символов в консоли не имеют к cmd.exe
никакого отношения, это так работает утилита sqlplus.exe, а, точнее, если копнуть вглубь,
так работает "C" RTL ввода-вывода этой и многих других консольных сишных утилит.

Тем не менее, тот же sqlplus.exe без проблем работает с UTF-8, когда его хостит msys2.
...
Рейтинг: 0 / 0
UTF-8 в консоли
    #40029326
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.когда его хостит msys2.

Ты не поверишь, но у MSYS - не текстовое окно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
UTF-8 в консоли
    #40029327
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно подумать, что cmd.exe фрагмент дисплея в текстовый режим переводит.
Важно то, что он может быть хостом для консольных приложений.
И что эти консольные приложения правильно работают с юникодом.
...
Рейтинг: 0 / 0
UTF-8 в консоли
    #40029342
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

volodin661Во-первых, непонятно зачем использовать в качестве связки неудачную корявую поделку 90-х
годов прошлого века ?

А что, в PowerShell работа с вводом/выводом UTF-8 лучше?..


Уточняю, вопрос был про то, лучше ли будет результат,
если запускать sqlplus.exe не из-под cmd, a из под powershell ?

Скорее всего, будет то же самое, но эксперимент - критерий истины,
проще всего, если эксперимент проведёт сам Alibek B. с той же sqlplus + powershell любой версии



Если же вопрос был про сравнение двух продуктов,
первый (cmd) - неизвестного автора и трудозатратами 'полторы недели на коленке'
и второй (powershell) - 20 лет разработки нескольких сотен человек с трудозатратами ~ 1 000 000 000 USD,
то на него я отвечать не буду.
...
Рейтинг: 0 / 0
UTF-8 в консоли
    #40029345
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
Можно подумать, что cmd.exe фрагмент дисплея в текстовый режим переводит.
Важно то, что он может быть хостом для консольных приложений.
И что эти консольные приложения правильно работают с юникодом.


Нет никакой проблемы самому стать царём хостом, запустить sqlplus.exe с нужным environment,
поймать его stdout и вывести самому, уже используя Win32 Console API.

И всё будет хорошо.
...
Рейтинг: 0 / 0
UTF-8 в консоли
    #40029347
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
volodin661
если запускать sqlplus.exe не из-под cmd, a из под powershell ?

Никакой разницы.
Даже эксперименты с FAR (который вроде бы использует именно консольное API) показали, что c UTF там не так просто.
...
Рейтинг: 0 / 0
UTF-8 в консоли
    #40029349
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
volodin661
Нет никакой проблемы самому стать царём хостом, запустить sqlplus.exe с нужным environment,
поймать его stdout и вывести самому, уже используя Win32 Console API.

Проблема в том, что для этого нужна среда разработки. С помощью bat-файлов хостом не стать.
Из готовых и более-менее нормальных инструментов есть разве что ConEmu и MSYS2, последний мне более удобен.
...
Рейтинг: 0 / 0
UTF-8 в консоли
    #40029354
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
volodin661
Нет никакой проблемы самому стать царём хостом, запустить sqlplus.exe с нужным environment,
поймать его stdout и вывести самому, уже используя Win32 Console API.

Проблема в том, что для этого нужна среда разработки. С помощью bat-файлов хостом не стать.
Из готовых и более-менее нормальных инструментов есть разве что ConEmu и MSYS2, последний мне более удобен.


Если на клиенте присутствует .Net framework, то такая среда разработки имеется в лице компиляторов C#, VB.NET, JS.NET,
сборщика проектов MSBuild и runtime библиотек.
...
Рейтинг: 0 / 0
UTF-8 в консоли
    #40029358
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это называется «нет никакой проблемы»?
В случае с MSYS2 решение задачи производится в три действия: скачать, выбрать шрифт Consolas, переделать скрипт из bat в sh. Тут действительно нет проблем.
...
Рейтинг: 0 / 0
UTF-8 в консоли
    #40029360
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

приблизительно так:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
@@  IF EXIST "__%~N0.exe" ( "__%~N0.exe" %* ) & (EXIT /B %ERRORLEVEL%) 
@@  FOR /F %%X IN ('DIR /B /S %WINDIR%\Microsoft.NET\Framework\CSC.EXE') DO @@(SET COMPILER=%%X)
@@  IF NOT DEFINED COMPILER (ECHO No .NET C# compiler presents in your computer !!!) & ( ECHO Goodbye !!! ) & ( EXIT/B -1 )
@@  FINDSTR /B /VC:@@  "%~F0" > "%~N0.cs"
@@  %COMPILER%  /OUT:"__%~N0.exe" /TARGET:exe "%~N0.cs"
@@  IF EXIST "__%~N0.exe" (ECHO Executable file __%~N0.exe created !!! ) & (ECHO Run %~N0 again !!!)  
@@  EXIT/B %ERRORLEVEL%
 
using System;
using System.IO;
using System.Diagnostics;
 
 
class Program {
 
    static void Main( string[] args) {
 
 
        try
        {
            using (var cmd = new Process())
            {
                cmd.StartInfo.FileName = @"sqlplus.exe";
                cmd.StartInfo.WorkingDirectory = @"C:\mydir";
                cmd.StartInfo.Arguments = "arg1 arg2 arg3";
                cmd.StartInfo.UseShellExecute = false;
                cmd.StartInfo.RedirectStandardOutput = true;
                cmd.Start();
 
                Console.WriteLine(cmd.StandardOutput.ReadToEnd());
 
                cmd.WaitForExit();
            }
        }
        catch ( Exception e )
        {
               Console.WriteLine( e.Message ); 
        }
    } 
}


и скачивать ничего не надо
...
Рейтинг: 0 / 0
UTF-8 в консоли
    #40029361
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но вариант с msys2 тоже годится, да.
...
Рейтинг: 0 / 0
UTF-8 в консоли
    #40029363
Фотография volodin661
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот этот мне оч. нравился: https://babun.github.io/
...
Рейтинг: 0 / 0
UTF-8 в консоли
    #40029426
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
volodin661
Скорее всего
... а с чего бы результатам различаться, если оба - консольные приложения и работают через один и тот же conhost?
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Windows [игнор отключен] [закрыт для гостей] / UTF-8 в консоли
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]