Re[4]: перекодировать в юникод
От: Sergey Россия  
Дата: 03.09.07 07:42
Оценка: -1
> Мнеб для начала понять как можно
> string buff("я");
> превратить в два байта

wstring buf(L"я");
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
перекодировать в юникод
От: Аноним  
Дата: 03.09.07 06:43
Оценка:
Здраствуйте.

Есть строка типа string. Когда пользователь вводит данные, программа в эту строку записывает его данные, затем, мне нужно эти символы, перегнать в utf-8.

Если он ввёл например иероглиф или русскую букву, как его перегнать в utf-8, не могу понять, саму последовательность дейсвий не понимаю. разъяните плиз.
Re: перекодировать в юникод
От: c-smile Канада http://terrainformatica.com
Дата: 03.09.07 06:54
Оценка:
Здравствуйте, Аноним, Вы писали:

А>... как его перегнать в utf-8, не могу понять, саму последовательность дейсвий не понимаю. разъяните плиз.


http://ru.wikipedia.org/wiki/UTF8
Re[2]: перекодировать в юникод
От: Аноним  
Дата: 03.09.07 07:03
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>http://ru.wikipedia.org/wiki/UTF8


а читал уже. Это всё теория, мне б посметреть как на практике всё это сделать, именно на си++.
Re[3]: перекодировать в юникод
От: Аноним  
Дата: 03.09.07 07:09
Оценка:
Мнеб для начала понять как можно
string buff("я");
превратить в два байта
Re[3]: перекодировать в юникод
От: c-smile Канада http://terrainformatica.com
Дата: 03.09.07 07:12
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, c-smile, Вы писали:


CS>>http://ru.wikipedia.org/wiki/UTF8


А>а читал уже. Это всё теория, мне б посметреть как на практике всё это сделать, именно на си++.


Там же все написано. (Тебе надо учится работать с инетом. Помогает сильно)

http://www.codeproject.com/cpp/utf8ostream.asp
Re[4]: перекодировать в юникод
От: Аноним  
Дата: 03.09.07 07:34
Оценка:
c-smile, а может расскажешь в двух словах, что к чему (как русский символ перекодировать)? а дальше я уже сам разбирусь.
Re[5]: перекодировать в юникод
От: Аноним  
Дата: 03.09.07 07:56
Оценка:
Sergey, а почему не такое решение предложил:
short unsigned buff = 'я';

?
Re: перекодировать в юникод
От: AleksandrN Россия  
Дата: 03.09.07 08:04
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здраствуйте.


А>Есть строка типа string. Когда пользователь вводит данные, программа в эту строку записывает его данные, затем, мне нужно эти символы, перегнать в utf-8.


А>Если он ввёл например иероглиф или русскую букву, как его перегнать в utf-8, не могу понять, саму последовательность дейсвий не понимаю. разъяните плиз.



Если пишешь в Windows, то смотри в MSDN описание функций MultiByteToWideChar и WideCharToMultiByte.
Если в UNIX — man 3 iconv.

Если требуется кросс-платформенный код, то в библиотеках Qt и wxWidgets есть средства для работы с различными кодировками.
Re[6]: перекодировать в юникод
От: Sergey Россия  
Дата: 03.09.07 08:15
Оценка:
> Sergey, а почему не такое решение предложил:

Потому что в вопросе было string.

>
> short unsigned buff = 'я';
>

> ?

Тогда уж short unsigned buff = L'я';
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[2]: перекодировать в юникод
От: Аноним  
Дата: 03.09.07 08:16
Оценка:
AN>Если в UNIX — man 3 iconv.

AN>Если требуется кросс-платформенный код, то в библиотеках Qt и wxWidgets есть средства для работы с различными кодировками.


я уверен, что есть очень простое решение.

Возьмём для примера букву 'а' (русская) в таблице символов unicode она числится под номером 0430h. Как перекодировать букву 'а' в 0430? мне только это нужно... а 0430 в utf-8 я уже сам перекодирую.
Re[7]: перекодировать в юникод
От: Аноним  
Дата: 03.09.07 08:22
Оценка:
Sergey, а я думал ты жжёшь.
unsigned long buff = L'а';
даёт 1072 а hex 0430...

а если символ иероглиф, то какой для него тип для buff определять?
Re[8]: перекодировать в юникод
От: Sergey Россия  
Дата: 03.09.07 08:36
Оценка:
> Sergey, а я думал ты жжёшь.
> unsigned long buff = L'а';
> даёт 1072 а hex 0430...
>
> а если символ иероглиф, то какой для него тип для buff определять?

Тип все тот же — чего-нибудь двухбайтовое. Лучше wchar_t, если компилятор про них знает.
Посмотрел начало темы — символ вводится пользователем (а не известен на стадии компиляции), соответственно надо пользоваться функциями mbtowc, _mbtowc_l, или codecvt::in, или виндовой MultiByteToWideChar.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[9]: перекодировать в юникод
От: Аноним  
Дата: 03.09.07 09:16
Оценка:
Здравствуйте, Sergey, Вы писали:

>> Sergey, а я думал ты жжёшь.

>> unsigned long buff = L'а';
>> даёт 1072 а hex 0430...
>>
>> а если символ иероглиф, то какой для него тип для buff определять?

S>Тип все тот же — чего-нибудь двухбайтовое. Лучше wchar_t, если компилятор про них знает.

S>Посмотрел начало темы — символ вводится пользователем (а не известен на стадии компиляции), соответственно надо пользоваться функциями mbtowc, _mbtowc_l, или codecvt::in, или виндовой MultiByteToWideChar.

а wchar_t может содержать 65536 символов, а в уникоде их ~99000, всеж ведь не влезут?
Re[9]: перекодировать в юникод
От: Аноним  
Дата: 03.09.07 09:23
Оценка:
а вообще, спасибо большое, если даже на последний вопрос не ответите
Re[10]: перекодировать в юникод
От: CiViLiS Россия  
Дата: 03.09.07 09:44
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>а wchar_t может содержать 65536 символов, а в уникоде их ~99000, всеж ведь не влезут?

Прочтите наконец wiki и все ссылки. Hint: смотреть отличия UC-2 и UTF-16
... << RSDN@Home 1.2.0 alpha rev. 727>>
"Бог не терпит голой сингулярности" -- Роджер Пенроуз
Re[10]: перекодировать в юникод
От: Sergey Россия  
Дата: 03.09.07 09:44
Оценка:
>>> Sergey, а я думал ты жжёшь.
>>> unsigned long buff = L'а';
>>> даёт 1072 а hex 0430...
>>>
>>> а если символ иероглиф, то какой для него тип для buff определять?
>
> S>Тип все тот же — чего-нибудь двухбайтовое. Лучше wchar_t, если компилятор про них знает.
> S>Посмотрел начало темы — символ вводится пользователем (а не известен на стадии компиляции), соответственно надо пользоваться функциями mbtowc, _mbtowc_l, или codecvt::in, или виндовой MultiByteToWideChar.
>
> а wchar_t может содержать 65536 символов, а в уникоде их ~99000, всеж ведь не влезут?

С такой экзотикой, которая в 16 бит не влазит, я пока не общался. Если надо с ними работать — попробуйте сразу конвертировать узкие строки в UTF-8, а не в UCS-2 (прокатит ли, нет ли — не знаю). Четырехбайтная кодировка (UTF-32), равно как и двухбайтная с переменной длиной символа (UTF-16), насколько я знаю, в винде не поддерживается. Возможно, дело решается с помощью сторонних библиотек.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[3]: перекодировать в юникод
От: Кодт Россия  
Дата: 03.09.07 10:00
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>я уверен, что есть очень простое решение.


А>Возьмём для примера букву 'а' (русская) в таблице символов unicode она числится под номером 0430h. Как перекодировать букву 'а' в 0430? мне только это нужно... а 0430 в utf-8 я уже сам перекодирую.


А откуда ты возьмёшь эту букву для примера?

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

Поэтому первый шаг — пергнать введённую строку в UTF-16: mbtowc(). И второй шаг — перегнать из UTF-16 в UTF-8: wctomb().
Либо сразу перегнать из текущей кодировки в желаемую UTF-8: libiconv.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[11]: перекодировать в юникод
От: Аноним  
Дата: 03.09.07 10:08
Оценка:
Здравствуйте, CiViLiS, Вы писали:

мне не нужны ссылки на теорию, я ж сказал уже, я её уже начитался. Велосипед трудно создавать, вы пробовали хоть?
Re[11]: перекодировать в юникод
От: Sergey Россия  
Дата: 03.09.07 10:15
Оценка:
> строки в UTF-8, а не в UCS-2 (прокатит ли, нет ли — не знаю). Четырехбайтная кодировка (UTF-32), равно как и двухбайтная с переменной длиной символа (UTF-16), насколько я знаю, в винде не поддерживается.

Вру — в MSDN пишут что начиная с Vista оно умеет UTF-16.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[12]: перекодировать в юникод
От: CiViLiS Россия  
Дата: 03.09.07 10:16
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>мне не нужны ссылки на теорию, я ж сказал уже, я её уже начитался. Велосипед трудно создавать, вы пробовали хоть?

Видать через строчку читал. Не знаю какой велосипед Вам нужен, но на вики и на unicode.org информации предостаточно.

PS Я не только пробовал, но и реализовывал и различные конверсии, а также другие алгоритмы для работы с уникодными строчками.
... << RSDN@Home 1.2.0 alpha rev. 727>>
"Бог не терпит голой сингулярности" -- Роджер Пенроуз
Re[4]: перекодировать в юникод
От: Аноним  
Дата: 03.09.07 10:18
Оценка:
Здравствуйте, Кодт, Вы писали:

К>А откуда ты возьмёшь эту букву для примера?


я cgi приложение пишу (браузер не кодирует данные). У меня есть функция, которая получает данные, которые прислал браузер и ложит в map из string'ов key=value. И вот некоторые элементы из map'a нужно перекодировать. Либу не хочу юзать (отступать не хочется
Re[13]: перекодировать в юникод
От: Аноним  
Дата: 03.09.07 10:26
Оценка:
Здравствуйте, CiViLiS, Вы писали:

не все ж такие умные, как Вы
Re[5]: перекодировать в юникод
От: Кодт Россия  
Дата: 03.09.07 11:11
Оценка:
Здравствуйте, <Аноним>, Вы писали:

К>>А откуда ты возьмёшь эту букву для примера?


А>я cgi приложение пишу (браузер не кодирует данные).


Вот с этого и надо было начинать!

А>У меня есть функция, которая получает данные, которые прислал браузер и ложит в map из string'ов key=value. И вот некоторые элементы из map'a нужно перекодировать. Либу не хочу юзать (отступать не хочется


А нельзя как-нибудь напрячь браузер присылать данные в нужной кодировке? А именно, прямо в UTF-8?
Ну а если юзер сам в URL понаписал чего попало — то или принять как есть (и считать это UTF-8), или всё-таки задействовать перекодировку.
В виндах это встроено в ОС, а в никсах — libiconv должна тоже входить. Иначе это какие-то кастрированные, минималистические никсы. (наверно).
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[12]: перекодировать в юникод
От: Кодт Россия  
Дата: 03.09.07 11:11
Оценка:
Здравствуйте, Sergey, Вы писали:

>> строки в UTF-8, а не в UCS-2 (прокатит ли, нет ли — не знаю). Четырехбайтная кодировка (UTF-32), равно как и двухбайтная с переменной длиной символа (UTF-16), насколько я знаю, в винде не поддерживается.


S>Вру — в MSDN пишут что начиная с Vista оно умеет UTF-16.


А пофиг, на самом деле. Если не заниматься выводом на экран или содержательной посимвольной обработкой, то какая разница, одно- или мульти-элементная кодировка?
Хотя, конечно, при конверсии из UTF-8 в WCHAR могут возникнуть приколы, если там попадётся символ за пределами UCS-2...
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[5]: перекодировать в юникод
От: AleksandrN Россия  
Дата: 03.09.07 11:20
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Кодт, Вы писали:


К>>А откуда ты возьмёшь эту букву для примера?


А>я cgi приложение пишу (браузер не кодирует данные). У меня есть функция, которая получает данные, которые прислал браузер и ложит в map из string'ов key=value. И вот некоторые элементы из map'a нужно перекодировать. Либу не хочу юзать (отступать не хочется


В этом случае можешь создать таблицу переконвертации вручную и написать свой конвертер, но стоит ли изобретать ещё один велосипед?

Покопайся в документации и настройках HTTP-сервера, возможно есть способ получить данные сразу в нужной кодировке.
Re[6]: перекодировать в юникод
От: Аноним  
Дата: 03.09.07 12:10
Оценка:
Здравствуйте, Кодт, Вы писали:

К>А нельзя как-нибудь напрячь браузер присылать данные в нужной кодировке? А именно, прямо в UTF-8?


Можно, я по началу так и делал, но оказывается, что так еще больше проблем.
А данные кодировать мне полюбому нужно научиться, потому что url кодирование нужно будет делать.

int main()
{
    string user_buff("это прислал юзер");

    wchar_t buff[1024];
    mbstowcs(buff, user_buff.c_str(), user_buff.size());


    cout << *buff << endl; // тут выводится 255 т.е. не преобразовывается нифига, почему-то...
    buff[0] = L'э'; // а так, всё работает как нужно. Почему так?
    cout << *buff << endl; 

    return 0;
}


зря я конечно про символы больше 65535 речь завёл, не буду вас мучать, когда припечёт меня эта тема, бубу разбираься.
Re[13]: перекодировать в юникод
От: Sergey Россия  
Дата: 03.09.07 12:18
Оценка:
>>> строки в UTF-8, а не в UCS-2 (прокатит ли, нет ли — не знаю). Четырехбайтная кодировка (UTF-32), равно как и двухбайтная с переменной длиной символа (UTF-16), насколько я знаю, в винде не поддерживается.
>
> S>Вру — в MSDN пишут что начиная с Vista оно умеет UTF-16.
>
> А пофиг, на самом деле. Если не заниматься выводом на экран или содержательной посимвольной обработкой, то какая разница, одно- или мульти-элементная кодировка?

Я не в курсе, может ли юзер в винде, не поддерживающей UTF-16, как-нибудь ввести символы, не попадающие в Plane 0 как MBCS. Но если может, то очевидно, что проблемы будут — в UCS-2 такие символы не представимы, и во что MultiByteToWideChar их превратит — х.з.

> Хотя, конечно, при конверсии из UTF-8 в WCHAR могут возникнуть приколы, если там попадётся символ за пределами UCS-2...
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[6]: перекодировать в юникод
От: Аноним  
Дата: 03.09.07 12:18
Оценка:
Здравствуйте, AleksandrN, Вы писали:

AN>В этом случае можешь создать таблицу переконвертации вручную и написать свой конвертер, но стоит ли изобретать ещё один велосипед?


Это моя самая первая идея я её быстренько отбросил. Можно ж ведь и без таблици обойтись...
Re[7]: перекодировать в юникод
От: Аноним  
Дата: 04.09.07 07:01
Оценка:
ап
Re[8]: перекодировать в юникод
От: Аноним  
Дата: 04.09.07 10:42
Оценка:
Люди, ну вы чё такие...

unsigned char buff = 'я';
wchar_t out_buff ; // - как сюда можно положить уже перекодированную букву я?
Re[9]: перекодировать в юникод
От: kvser  
Дата: 04.09.07 10:50
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Люди, ну вы чё такие...


А>
А>unsigned char buff = 'я';
А>wchar_t out_buff ; // - как сюда можно положить уже перекодированную букву я?
А>


я этого никогда не делал...но, за это время пока существует данный тред, я думаю уже можно было самому найти соответствующую информацию в доступных источниках
Re[9]: перекодировать в юникод
От: CiViLiS Россия  
Дата: 04.09.07 11:32
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Люди, ну вы чё такие...


А>
А>unsigned char buff = 'я';
А>wchar_t out_buff ; // - как сюда можно положить уже перекодированную букву я?
А>

Уж извините, что опять ссылку дам... mbtowc (не забывая установить локаль) или MultiByteToWideChar. На этих страницах есть примеры.
... << RSDN@Home 1.2.0 alpha rev. 743>>
"Бог не терпит голой сингулярности" -- Роджер Пенроуз
Re[9]: перекодировать в юникод
От: Sergey Россия  
Дата: 04.09.07 11:51
Оценка:
" Аноним 872 " <0@users.rsdn.ru> wrote in message news:2644449@news.rsdn.ru...
> Люди, ну вы чё такие...
>
>
> unsigned char buff = 'я';
> wchar_t out_buff ; // - как сюда можно положить уже перекодированную букву я?
>


int result = mbtowc(&out_buff, &buff, 1);
Только:
1) unsigned убери.
2) перекодируй целые строки. Если юзер ввел чего-нибудь китайское, в один char символ не влезет и работать твоя конверсия будет неправильно.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[10]: перекодировать в юникод
От: Аноним  
Дата: 04.09.07 13:16
Оценка:
Здравствуйте, Sergey, Вы писали:

int main()
{
char buff = 'я';
wchar_t out_buff;

// не работает
mbtowc(&out_buff, &buff, 1);
cout << out_buff << endl;

// тут правильно всё работает.
out_buff = L'я';
cout << out_buff;
}
программа выводит:
255
1103
почему у меня mbtowc не перекодирует символ?
Re[11]: перекодировать в юникод
От: Sergey Россия  
Дата: 04.09.07 13:31
Оценка:
Здравствуйте, Аноним, Вы писали:

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


А>int main()

А>{
А> char buff = 'я';
А> wchar_t out_buff;

А> // не работает

А> mbtowc(&out_buff, &buff, 1);
А> cout << out_buff << endl;

А> // тут правильно всё работает.

А> out_buff = L'я';
А> cout << out_buff;
А>}
А>программа выводит:
А>255
А>1103
А>почему у меня mbtowc не перекодирует символ?

Ну так надо же еще и локаль соответствующую выставить. Иначе откуда программа узнает, что символ с кодом 255 — это русская буква? Может это вовсе не 'я', а 'ÿ'.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[12]: перекодировать в юникод
От: Аноним  
Дата: 04.09.07 15:41
Оценка:
Серёг, а если мне на нескольких языках прислали данные, что делать?
Re[13]: перекодировать в юникод
От: Sergey Россия  
Дата: 04.09.07 15:48
Оценка:
> Серёг, а если мне на нескольких языках прислали данные, что делать?

В том месте, в котором данные пришли, известно в какой они кодировке? Если нет, то задача не решается. Т.е., можно конечно попробовать догадаться, но это не всегда получится.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[14]: перекодировать в юникод
От: Аноним  
Дата: 04.09.07 17:44
Оценка:
Здравствуйте, Sergey, Вы писали:
А как-то ж в php реализованно. щас исходники разбираю его...
Re: перекодировать в юникод
От: avsokolov  
Дата: 05.09.07 03:24
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здраствуйте.


А>Есть строка типа string. Когда пользователь вводит данные, программа в эту строку записывает его данные, затем, мне нужно эти символы, перегнать в utf-8.


У меня похожая проблема, конкретный пример из MSDN, который у меня не компилируется:

WIN32_FIND_DATA FindFileData;
char DirSpec[MAX_PATH];
HANDLE hFile=FindFirstFile(DirSpec, &FindFileData);

не может конвертировать из const char * to LPCWSTR

допустим, я вместо char DirSpec[MAX_PATH]; напишу:
wchar_t DirSpec[MAX_PATH];
тогда, вродебы не выдается ошибка во время компиляции, но если я хочу, чтобы пользователь ввел имя каталога:
cin.get(DirSpec, MAX_PATH);

теперь будет ругаться на cin.get, т.к. не сможет конвертировать в const char *

отсюда два вопроса:
1. как решить проблему, чтобы можно было пользоваться потоковыми классами С++ и функциями Windows
2. почему готовый пример MSDN не работает?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.