RH 9. Попытка вывода по-русски.
От: Qrdl  
Дата: 28.01.05 08:58
Оценка:
Пишу:

#include <stdlib.h>
#include <wchar.h>

int main(int argc, char *argv[])
{
wprintf (L"Test Тест Test\n");
return EXIT_SUCCESS;
}

Вижу:

Test ???u???? Test


Так что я делаю неправильно?

/etc/sysconfig/i18n:

LANG="ru_RU.UTF-8"
SYSFONT="latarcyrheb-sun16"

Системные сообщения выводятся по-русски нормально. Ввод с клавиатуры также не вызывает нареканий.

/etc/sysconfig/keyboard:

KEYBOARDTYPE="pc"
KEYTABLE="ru-utf"
Re: RH 9. Попытка вывода по-русски.
От: aat Россия  
Дата: 28.01.05 11:51
Оценка:
Здравствуйте, Qrdl, Вы писали:

Q>Пишу:


Q>#include <stdlib.h>

Q>#include <wchar.h>

Q>int main(int argc, char *argv[])

Q>{
Q> wprintf (L"Test Тест Test\n");
Q> return EXIT_SUCCESS;
Q>}

Q>Вижу:


Q>Test ???u???? Test



Q>Так что я делаю неправильно?


Q>/etc/sysconfig/i18n:


Q>LANG="ru_RU.UTF-8"

Q>SYSFONT="latarcyrheb-sun16"

Q>Системные сообщения выводятся по-русски нормально. Ввод с клавиатуры также не вызывает нареканий.


Q>/etc/sysconfig/keyboard:


Q>KEYBOARDTYPE="pc"

Q>KEYTABLE="ru-utf"

А зачем в utf, можно и koi с обычным printf.
Re[2]: RH 9. Попытка вывода по-русски.
От: Qrdl  
Дата: 28.01.05 12:46
Оценка:
Здравствуйте, aat, Вы писали:

aat>А зачем в utf, можно и koi с обычным printf.


После того как поработал с win32 в Unicode воспримаю локальные кодировки как личное оскорбление
К счастью, Linux повзрослел, в нем тоже появился юникод , ну... почти появился
Хочу, наконец, его применить. Но, видимо, пока не всё устаканилось. Да и сложнее реализация: консоль UTF-8 -> ядро UCS-4 -> консоль UTF-8 vs win32 UCS-2 везде.

Прогресс не остановить...
Re: RH 9. Попытка вывода по-русски.
От: Murr Россия  
Дата: 28.01.05 13:47
Оценка:
Здравствуйте, Qrdl, Вы писали:

Q>Пишу:


Я бы удивился, если бы 4-байтные символы "правильно" бы вывелись на UTF-8 консоль.
Re[3]: RH 9. Попытка вывода по-русски.
От: Murr Россия  
Дата: 28.01.05 13:56
Оценка:
Здравствуйте, Qrdl, Вы писали:

Q>Здравствуйте, aat, Вы писали:


aat>>А зачем в utf, можно и koi с обычным printf.


Q>После того как поработал с win32 в Unicode воспримаю локальные кодировки как личное оскорбление

Q>К счастью, Linux повзрослел, в нем тоже появился юникод , ну... почти появился

Еще бы программисты взрослели и читали GLIBC info (главы локализации и перекодировки), прежде чем начинать что-либо писать...

Q>ядро UCS-4


Какой вы в это вкладываете смысл?

Для ядра Linux строки не обладают "кодировкой", скорее просто BLOB.

Единственные два исключения, которые приходят на ум — имена файлов для тех ФС, которые используют NLS (при этом обычно и исходная и целевая таблицы символов указываются вручную, при этом такой NLS как UCS-4 нет), ну и собственно драйвер консоли.

Q>Прогресс не остановить...


Аминь.
Re[2]: RH 9. Попытка вывода по-русски.
От: Qrdl  
Дата: 28.01.05 15:01
Оценка:
Здравствуйте, Murr, Вы писали:

M>Здравствуйте, Qrdl, Вы писали:


Q>>Пишу:


M>Я бы удивился, если бы 4-байтные символы "правильно" бы вывелись на UTF-8 консоль.


Боюсь я вас удивлю.
info unicode:
Библиотечные функции wctomb? mctowc, wprintf могут использоваться для преобразования символов строк типа wchar_t, которые используются в программе, в системную кодировку и обратно.
Re[3]: RH 9. Попытка вывода по-русски.
От: Murr Россия  
Дата: 28.01.05 15:35
Оценка:
Здравствуйте, Qrdl, Вы писали:

Q>Здравствуйте, Murr, Вы писали:


M>>Здравствуйте, Qrdl, Вы писали:


Q>>>Пишу:


M>>Я бы удивился, если бы 4-байтные символы "правильно" бы вывелись на UTF-8 консоль.


Q>Боюсь я вас удивлю.

Q>info unicode:
Q>Библиотечные функции wctomb? mctowc, wprintf могут использоваться для преобразования символов строк типа wchar_t, которые используются в программе, в системную кодировку и обратно.

Нет, вы меня не удивите. Но "w", как слона, я в wprintf действительно не заметил.
Попробуйте перед wprintf сделать setlocale(LC_CTYPE, "ru_RU.UTF-8"); и напишите сработает ли это.
Re[4]: RH 9. Попытка вывода по-русски.
От: Qrdl  
Дата: 28.01.05 16:01
Оценка:
Здравствуйте, Murr, Вы писали:

Q>>После того как поработал с win32 в Unicode воспримаю локальные кодировки как личное оскорбление

Q>>К счастью, Linux повзрослел, в нем тоже появился юникод , ну... почти появился

M>Еще бы программисты взрослели и читали GLIBC info (главы локализации и перекодировки), прежде чем начинать что-либо писать...


Прочитал практически все manы и info (из RH9) имеющие отношение к вопросу, решения не нашел. Прошу помощи.
При использовании юникода перекодировка (из/в UTF-8, UTF-16, UCS-2, UCS-4), насколько я понимаю, ну никак не зависит от локализации. Зачем еще он нужен-то юникод?

Q>>ядро UCS-4


M>Какой вы в это вкладываете смысл?


Здесь какое-то противоречие в доках:

man setfont:
Several mappings are involved in the path from user program output to
console display. If the console is in utf8 mode (see unicode_start(1))
then the kernel expects that user program output is coded as UTF-8 (see
utf-8(7)), and converts that to Unicode (ucs2). Otherwise, a transla-
tion table is used from the 8-bit program output to 16-bit Unicode val-
ues. Such a translation table is called a Unicode console map. There
are four of them: three built into the kernel, the fourth settable
using the -m option of setfont. An escape sequence chooses between
these four tables; after loading a cmap, setfont will output the escape
sequence Esc ( K that makes it the active translation.

Как следует из этого текста таблицы перекодировки Unicode console map ВСТРОЕНЫ В ЯДРО (three built into the kernel), но упоминается UCS-2

man unicode:
UNICODE UNDER LINUX
Under GNU/Linux, the C type wchar_t is a signed 32-bit integer type.
Its values are always interpreted by the C library as UCS code values
(in all locales), a convention that is signaled by the GNU C library to
applications by defining the constant __STDC_ISO_10646__ as specified
in the ISO C 99 standard.

UCS/Unicode can be used just like ASCII in input/output streams, termi-
nal communication, plaintext files, filenames, and environment vari-
ables in the ASCII compatible UTF-8 multi-byte encoding. To signal the
use of UTF-8 as the character encoding to all applications, a suitable
locale has to be selected via environment variables (e.g.,
"LANG=en_GB.UTF-8").

А здесь говорится что (Under GNU/Linux, the C type wchar_t is a signed 32-bit integer type)
т.е. если в линуксе используется юникод — он UCS-4



M>Для ядра Linux строки не обладают "кодировкой", скорее просто BLOB.


M>Единственные два исключения, которые приходят на ум — имена файлов для тех ФС, которые используют NLS (при этом обычно и исходная и целевая таблицы символов указываются вручную, при этом такой NLS как UCS-4 нет), ну и собственно драйвер консоли.


Q>>Прогресс не остановить...


M>Аминь.
Re[4]: RH 9. Попытка вывода по-русски.
От: Qrdl  
Дата: 28.01.05 16:04
Оценка:
Здравствуйте, Murr, Вы писали:

M>Здравствуйте, Qrdl, Вы писали:


Q>>Здравствуйте, Murr, Вы писали:


M>>>Здравствуйте, Qrdl, Вы писали:


Q>>>>Пишу:


M>>>Я бы удивился, если бы 4-байтные символы "правильно" бы вывелись на UTF-8 консоль.


Q>>Боюсь я вас удивлю.

Q>>info unicode:
Q>>Библиотечные функции wctomb? mctowc, wprintf могут использоваться для преобразования символов строк типа wchar_t, которые используются в программе, в системную кодировку и обратно.

M>Нет, вы меня не удивите. Но "w", как слона, я в wprintf действительно не заметил.

M>Попробуйте перед wprintf сделать setlocale(LC_CTYPE, "ru_RU.UTF-8"); и напишите сработает ли это.

Пробовал. Изменился только вид кракозябриков, но не результат.
Re[5]: RH 9. Попытка вывода по-русски.
От: Murr Россия  
Дата: 28.01.05 16:09
Оценка:
Здравствуйте, Qrdl, Вы писали:

Q>Пробовал. Изменился только вид кракозябриков, но не результат.


Наверное, что-то побито в системных настройках или файлах.
У меня работает. И в X и в консоли.

#include <stdlib.h>
#include <wchar.h>
#include <locale.h>

int main(int argc, char *argv[])
{
    setlocale(LC_CTYPE, "ru_RU.UTF-8");
    wprintf (L"Test Тест Test\n");
    return EXIT_SUCCESS;
}
Re[6]: RH 9. Попытка вывода по-русски.
От: Qrdl  
Дата: 28.01.05 16:35
Оценка:
Здравствуйте, Murr, Вы писали:

M>Здравствуйте, Qrdl, Вы писали:


Q>>Пробовал. Изменился только вид кракозябриков, но не результат.


M>Наверное, что-то побито в системных настройках или файлах.

M>У меня работает. И в X и в консоли.

M>
M>#include <stdlib.h>
M>#include <wchar.h>
M>#include <locale.h>

M>int main(int argc, char *argv[])
M>{
M>    setlocale(LC_CTYPE, "ru_RU.UTF-8");
M>    wprintf (L"Test Тест Test\n");
M>    return EXIT_SUCCESS;
M>}
M>


Ага!!! Истина где-то рядом! А у меня "Test ТеÑÑ Test". Приступаю к хирургическому вмешательству
Спа
Re[6]: RH 9. Попытка вывода по-русски.
От: Аноним  
Дата: 17.02.05 11:32
Оценка:
Здравствуйте, Murr, Вы писали:

M>Здравствуйте, Qrdl, Вы писали:


Q>>Пробовал. Изменился только вид кракозябриков, но не результат.


M>Наверное, что-то побито в системных настройках или файлах.

M>У меня работает. И в X и в консоли.

M>
M>#include <stdlib.h>
M>#include <wchar.h>
M>#include <locale.h>

M>int main(int argc, char *argv[])
M>{
M>    setlocale(LC_CTYPE, "ru_RU.UTF-8");
M>    wprintf (L"Test Тест Test\n");
M>    return EXIT_SUCCESS;
M>}
M>



На FC3 заработало как надо...
Там же нашел вот что:
7.4 How Programs Set the Locale

A C program inherits its locale environment variables when it starts up.
This happens automatically. However, these variables do not
automatically control the locale used by the library functions, because
ISO C says that all programs start by default in the standard `C'
locale. To use the locales specified by the environment, you must call
`setlocale'. Call it as follows:


setlocale (LC_ALL, "");

Теперь пример выглядит так:

#include <stdlib.h>
#include <wchar.h>
#include <locale.h>

int main(int argc, char *argv[])
{
    setlocale(LC_CTYPE, "");
    wprintf (L"Test Тест Test\n");
    return EXIT_SUCCESS;
}


Всем спасибо. Все свободны.
Re: RH 9. Попытка вывода по-русски.
От: Helena Россия  
Дата: 02.03.05 18:04
Оценка:
Здравствуйте, Qrdl, Вы писали:


Q>Так что я делаю неправильно?


смотреть надо сюда http://www.rsdn.ru/article/qna/ui/concp.xml
Автор(ы): Алексей Кирюшкин
Re: RH 9. Попытка вывода по-русски.
От: raise_app_error Украина  
Дата: 09.03.05 12:19
Оценка:
Здравствуйте, Qrdl, Вы писали:

Q> wprintf (L"Test Тест Test\n");


Попробуйте работать в редакторе, который позволяет сохранять текст сразу в UTF-8 и там эту строку запишите

wprintf ("Test Тест Test\n");
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.