Здравствуйте, 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"
Здравствуйте, aat, Вы писали:
aat>А зачем в utf, можно и koi с обычным printf.
После того как поработал с win32 в Unicode воспримаю локальные кодировки как личное оскорбление
К счастью, Linux повзрослел, в нем тоже появился юникод , ну... почти появился
Хочу, наконец, его применить. Но, видимо, пока не всё устаканилось. Да и сложнее реализация: консоль UTF-8 -> ядро UCS-4 -> консоль UTF-8 vs win32 UCS-2 везде.
Здравствуйте, Qrdl, Вы писали:
Q>Здравствуйте, aat, Вы писали:
aat>>А зачем в utf, можно и koi с обычным printf.
Q>После того как поработал с win32 в Unicode воспримаю локальные кодировки как личное оскорбление Q>К счастью, Linux повзрослел, в нем тоже появился юникод , ну... почти появился
Еще бы программисты взрослели и читали GLIBC info (главы локализации и перекодировки), прежде чем начинать что-либо писать...
Q>ядро UCS-4
Какой вы в это вкладываете смысл?
Для ядра Linux строки не обладают "кодировкой", скорее просто BLOB.
Единственные два исключения, которые приходят на ум — имена файлов для тех ФС, которые используют NLS (при этом обычно и исходная и целевая таблицы символов указываются вручную, при этом такой NLS как UCS-4 нет), ну и собственно драйвер консоли.
Q>Прогресс не остановить...
Здравствуйте, Murr, Вы писали:
M>Здравствуйте, Qrdl, Вы писали:
Q>>Пишу:
M>Я бы удивился, если бы 4-байтные символы "правильно" бы вывелись на UTF-8 консоль.
Боюсь я вас удивлю.
info unicode:
Библиотечные функции wctomb? mctowc, wprintf могут использоваться для преобразования символов строк типа wchar_t, которые используются в программе, в системную кодировку и обратно.
Здравствуйте, 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"); и напишите сработает ли это.
Здравствуйте, 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>Аминь.
Здравствуйте, 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"); и напишите сработает ли это.
Пробовал. Изменился только вид кракозябриков, но не результат.
Здравствуйте, Murr, Вы писали:
M>Здравствуйте, Qrdl, Вы писали:
Q>>Пробовал. Изменился только вид кракозябриков, но не результат.
M>Наверное, что-то побито в системных настройках или файлах. M>У меня работает. И в X и в консоли.
M>
Ага!!! Истина где-то рядом! А у меня "Test ТеÑÑ Test". Приступаю к хирургическому вмешательству
Спа
Re[6]: RH 9. Попытка вывода по-русски.
От:
Аноним
Дата:
17.02.05 11:32
Оценка:
Здравствуйте, Murr, Вы писали:
M>Здравствуйте, Qrdl, Вы писали:
Q>>Пробовал. Изменился только вид кракозябриков, но не результат.
M>Наверное, что-то побито в системных настройках или файлах. M>У меня работает. И в X и в консоли.
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: