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...
Пока на собственное сообщение не было ответов, его можно удалить.