LINUX.ORG.RU

wchar_t


0

1

Задача: ввести руские символы в массив.


setlocale(LC_ALL, "ru_RU.utf8");


wchar_t c = getwchar();
putwchar(c);

Что я не так делаю, почему выводит кракозябры, а не русские символы. Хотя код с=1040 (А в Unicode). Что не так?

Что возвращает setlocale? Вызов успешно проходит?

amomymous ★★★
()

хз. умвр

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

int main() {
    if (!setlocale(LC_ALL, "ru_RU.UTF-8")) {
        printf("something wrong\n");
        return -1;
    }
    wchar_t c = getwchar();
    putwchar(c);
    return 0;
}

anonymous
()
Ответ на: комментарий от anonymous

setlocale возращает строку «ru_RU.utf8»

У меня эмулятор gnome-terminal.

[code] [denis@denis-laptop ~]$ locale -a C en_US.utf8 POSIX ru_RU ru_RU.iso88595 ru_RU.utf8 russian ru_UA ru_UA.koi8u ru_UA.utf8

[/code]

denisnet
() автор топика

на правах «копетана»: для ввода русских букв Вам необязательно нужен wchar_t

shty ★★★★★
()
Ответ на: комментарий от panter_dsd

Так, кто нибудь знает, в чем проблема. Дело в том, что считывается символ правильно, т.е. ввожу А (1040).

denisnet
() автор топика
Ответ на: комментарий от denisnet

Если не нужно работать со строками (то есть, если они нужны только для ввода-вывода), проще обходится char и char*, благо UTF8 тем и крут, любые строки прекрасно живут в обычных массивах символов.

p.s. Какая в системе локаль? Если просто locale запустить?

p.p.s. Можно в конце цонцов проверить, что в этом wchar получается - в какой момент все портится.

ratatosk
()
Ответ на: комментарий от denisnet

Как предлагаешь, перекодировать символ?

задача стоит именно в «перекодировании» символов?

hint: в ascii есть русские буквы

shty ★★★★★
()
Ответ на: комментарий от anonymous

не учи плохому

что тут плохого? :)

shty ★★★★★
()
Ответ на: комментарий от Begemoth

1. И в каком месте это ASCII?

это не ASCII - это стандарт :))) погуглите уже что такое ISO/IEC 8859

2. Где это говно мамонта ещё используется?

да буквально везде :) *SURPRISE*

shty ★★★★★
()
Ответ на: комментарий от shty

это не ASCII - это стандарт :))) погуглите уже что такое ISO/IEC 8859

Я знаю, что это такое, но твое исходное утверждение было «hint: в ascii есть русские буквы», а потом оказывается, что не в ASCII, а ISO/IEC 8859, с таким же успехом можно было про КОИ-8 вспомнить.

Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

твое исходное утверждение было «hint: в ascii есть русские буквы», а потом оказывается, что не в ASCII, а ISO/IEC 8859

в эту игру можно играть вдвоём - расскажите же мне, несведующему, что регламентирует пресловутый ISO/IEC 8859-5:1999

shty ★★★★★
()
Ответ на: комментарий от Begemoth

> да буквально везде

А по пунктам можно?

да

char*

так достаточно подробно? :)

shty ★★★★★
()
Ответ на: комментарий от Begemoth

>1. И в каком месте это ASCII?

Открываем хорошую книгу и читаем,если нет книги,берем википедию глава: «Национальные варианты ASCII»

mopsene ★★★
()
Ответ на: комментарий от Begemoth

А то в Unicode первые 128 символов с ASCII совпадают

что значит совпадают? в unicode сколько бит, а в ascii? с какого они должны совпадать?

shty ★★★★★
()
Ответ на: комментарий от Begemoth

В ASCII - 7 бит, в ISO/IEC 8859 - 8 «с какого они должны совпадать?»

так ты можешь ответить на вопрос что декларирует ISO/IEC 8859-5:1999, или нет?

shty ★★★★★
()
Ответ на: комментарий от shty

Я отлично понимаю, что такое UTF-8 и что такое ISO/IEC 8859 - 8. Мне нужно, чтобы каждый символ хранился в wchar_t типе, для дальнейшей обработки посимвольно.

Коды символов совпадают кодам, которые в UTF-8 таблице. Но, почемуто putwchar(c) выводит не то. Так, что же такое?

denisnet
() автор топика
Ответ на: комментарий от denisnet

> Так, что же такое?

похоже, движок лора глюкнул и случайно прибил твоё сообщение с выводом команды «locale»… попробуй запостить ещё раз.

arsi ★★★★★
()
Ответ на: комментарий от arsi

setlocale возращает строку «ru_RU.utf8»

У меня эмулятор gnome-terminal.

 [denis@denis-laptop ~]$ locale -a C en_US.utf8 POSIX ru_RU ru_RU.iso88595 ru_RU.utf8 russian ru_UA ru_UA.koi8u ru_UA.utf8

denisnet
() автор топика
Ответ на: комментарий от denisnet

> setlocale возращает строку «ru_RU.utf8»

> У меня эмулятор gnome-terminal.

> locale -a

а это ли тебя спрашивали?

arsi ★★★★★
()
Ответ на: комментарий от denisnet

Я отлично понимаю, что такое UTF-8 и что такое ISO/IEC 8859 - 8.

это прекрасно :)

теперь, по существу вопроса: Вам же уже говорили - код работает, скорее всего не установлена нужная локаль, чтобы это попределить надо привести здесь выхлоп locale

выглядит он как-то так:

[shty@localhost]$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=
locale -a

выводит все доступные локали, и это не то же самое что все установленные локали

всей больницей ждём выхлопа, будете тянуть - напишем в спортлото

shty ★★★★★
()
Ответ на: комментарий от shty

LANG=en_US.utf8
LC_CTYPE="en_US.utf8"
LC_NUMERIC="en_US.utf8"
LC_TIME="en_US.utf8"
LC_COLLATE="en_US.utf8"
LC_MONETARY="en_US.utf8"
LC_MESSAGES="en_US.utf8"
LC_PAPER="en_US.utf8"
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT="en_US.utf8"
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=


denisnet
() автор топика
Ответ на: комментарий от denisnet

какая кодировка в гномотерминале?

arsi ★★★★★
()
Ответ на: комментарий от shty

Может я не правильно понял: [code] The following options shall be supported:

-a Write information about all available public locales. The available locales shall include POSIX, representing the POSIX locale. The manner in which the implementation determines what other locales are available is implementation-defined. [/code]

denisnet
() автор топика
Ответ на: комментарий от denisnet

Если бы локаль не была бы доступна, то бы функция setlocale не возращала ru_RU.utf8. Я посмотрел, в программе не печтаються и английские символы, хотя, в debuge пишет text = L"text\0" (т.е. - строка не пуста). И если перехожу к char, английские тоже печатает.

Насчет терминала. Я думаю, что как у всех, работают, в UTF8. А где можно посмотреть?

denisnet
() автор топика
Ответ на: комментарий от anonymous

А что тагда пишет locale -a


locale -a
C
en_US.utf8
POSIX
ru_RU
ru_RU.iso88595
ru_RU.utf8
russian
ru_UA
ru_UA.koi8u
ru_UA.utf8

denisnet
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.