Есть строка типа string. Когда пользователь вводит данные, программа в эту строку записывает его данные, затем, мне нужно эти символы, перегнать в utf-8.
Если он ввёл например иероглиф или русскую букву, как его перегнать в utf-8, не могу понять, саму последовательность дейсвий не понимаю. разъяните плиз.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, c-smile, Вы писали:
CS>>http://ru.wikipedia.org/wiki/UTF8
А>а читал уже. Это всё теория, мне б посметреть как на практике всё это сделать, именно на си++.
Там же все написано. (Тебе надо учится работать с инетом. Помогает сильно)
Здравствуйте, Аноним, Вы писали:
А>Здраствуйте.
А>Есть строка типа string. Когда пользователь вводит данные, программа в эту строку записывает его данные, затем, мне нужно эти символы, перегнать в utf-8.
А>Если он ввёл например иероглиф или русскую букву, как его перегнать в utf-8, не могу понять, саму последовательность дейсвий не понимаю. разъяните плиз.
Если пишешь в Windows, то смотри в MSDN описание функций MultiByteToWideChar и WideCharToMultiByte.
Если в UNIX — man 3 iconv.
Если требуется кросс-платформенный код, то в библиотеках Qt и wxWidgets есть средства для работы с различными кодировками.
Одним из 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 определять?
> 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
Оценка:
а вообще, спасибо большое, если даже на последний вопрос не ответите
Здравствуйте, <Аноним>, Вы писали:
А>а wchar_t может содержать 65536 символов, а в уникоде их ~99000, всеж ведь не влезут?
Прочтите наконец wiki и все ссылки. Hint: смотреть отличия UC-2 и UTF-16
... << RSDN@Home 1.2.0 alpha rev. 727>>
"Бог не терпит голой сингулярности" -- Роджер Пенроуз
>>> 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 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, <Аноним>, Вы писали:
А>я уверен, что есть очень простое решение.
А>Возьмём для примера букву 'а' (русская) в таблице символов 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, Вы писали:
мне не нужны ссылки на теорию, я ж сказал уже, я её уже начитался. Велосипед трудно создавать, вы пробовали хоть?
> строки в UTF-8, а не в UCS-2 (прокатит ли, нет ли — не знаю). Четырехбайтная кодировка (UTF-32), равно как и двухбайтная с переменной длиной символа (UTF-16), насколько я знаю, в винде не поддерживается.
Вру — в MSDN пишут что начиная с Vista оно умеет UTF-16.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.