Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Работа с libxml2  (Прочитано 1913 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Дядюшка Ау

  • Автор темы
  • Участник
  • *
  • Сообщений: 123
  • Дайте две!
    • Просмотр профиля
Работа с libxml2
« : 01 Июня 2012, 17:59:29 »
Может кто знает, проясните такой момент:
Нужно разобрать XML документ, который лежит в памяти.

В популярной библиотеке libxml есть такая функция:
Код: (C++) [Выделить]
xmlParseMemory(const char* buffer, int buffer_size)
Непонятка вот в чем. buffer объявлен, как const char, а документ сформирован в формате utf-8 и лежит в буфере с типом wchar_t. В документации на libxml вроде бы говорится, что она внутри поддерживает utf-8 и работает только с ним.
Нужно ли мне переделывать буфер wchar_t в char или она и так поймет.
Если нужно конвертировать, то как это правильно сделать, чтобы не потерять русские буквы и спецсимволы?
Ubuntu 12.04 для поколупацца, Win7 для поработать

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Работа с libxml2
« Ответ #1 : 02 Июня 2012, 21:12:58 »
у тебя концы с концами не сходятся
1) utf8 кодировка с переменной длиной символа и хранят её какраз в char*
2) в wchar_t хранят символы во внутреннем представлении широкие символы по одному wchar_t на символ. никакой переменной длины на 1 символ.

Первое что надо сделать это понять через какую задницу ты UTF8 запихнул в wchar_t.

Оффлайн Дядюшка Ау

  • Автор темы
  • Участник
  • *
  • Сообщений: 123
  • Дайте две!
    • Просмотр профиля
Re: Работа с libxml2
« Ответ #2 : 04 Июня 2012, 07:35:33 »
у тебя концы с концами не сходятся
1) utf8 кодировка с переменной длиной символа и хранят её какраз в char*
2) в wchar_t хранят символы во внутреннем представлении широкие символы по одному wchar_t на символ. никакой переменной длины на 1 символ.

Первое что надо сделать это понять через какую задницу ты UTF8 запихнул в wchar_t.

Да я и сам вижу, что концы с концами не сходятся. Мне данные приходят из внешней программы, как wchar_t, а файл, из которого они получены - в utf-8. Вроде разобрался, спасибо.

Пользователь решил продолжить мысль 04 Июня 2012, 15:07:23:
Чорт. Что-то никак не разберусь с кодировками....
Дано: из внешней программы поступает XML-текст в виде массива wchar_t. Сам xml помечен, как utf-8.
Требуется - скормить его библиотеке libxml2 в виде массива char, который должен быть в кодировке utf-8. Насколько я понял, функции типа wcstomb не прокатывают, т.к. они конвертируют в зависимости от локали. Как правильно конвертировать utf-8 текст из wchar_t* в char_t* ??
« Последнее редактирование: 04 Июня 2012, 15:07:23 от Дядюшка Ау »
Ubuntu 12.04 для поколупацца, Win7 для поработать

Оффлайн mkarasik

  • Участник
  • *
  • Сообщений: 163
    • Просмотр профиля
Re: Работа с libxml2
« Ответ #3 : 04 Июня 2012, 20:46:06 »
Как правильно конвертировать utf-8 текст из wchar_t* в char_t* ??

Не может utf8 быть wchar_t писали уже.

Первое что надо сделать это понять через какую задницу ты UTF8 запихнул в wchar_t.

Так вот когда разберешся через ту же задницу, только в обратном порядке.

Твоя сторонняя программа использовала какую то локаль скорее всего когда конвертировала этот файл. Скорее всего дефолтную, ну так так же и конвертируй назад.

Оффлайн Дядюшка Ау

  • Автор темы
  • Участник
  • *
  • Сообщений: 123
  • Дайте две!
    • Просмотр профиля
Re: Работа с libxml2
« Ответ #4 : 04 Июня 2012, 23:14:23 »
Как правильно конвертировать utf-8 текст из wchar_t* в char_t* ??
Не может utf8 быть wchar_t писали уже.


Хорошо, постараюсь перефразировать, может, будет понятнее...
Есть массив типа wchar. В нем, каждый символ представлен 2 байтами (в линуксе 4мя). Нужно из него получить массив, где символы с кодом > 127 представлены в виде нескольких байтов, означающих unicode code points. Коды < 127 представлены в однобайтовом виде. Так понятнее? wchar это способ хранения, а не кодировка юникода. Наверняка же есть библиотека, которая сама разбирает входной массив и лепит в выходной массив один, два или более байт на символ.
Ubuntu 12.04 для поколупацца, Win7 для поработать

Оффлайн mkarasik

  • Участник
  • *
  • Сообщений: 163
    • Просмотр профиля
Re: Работа с libxml2
« Ответ #5 : 05 Июня 2012, 01:54:32 »
Ты так и не об'яснил что ты там получаешь на входе. Скорее всего utf32 если 4 байта. Попробуй покопать в сторону iconv_open, iconv.


Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Работа с libxml2
« Ответ #6 : 06 Июня 2012, 08:42:21 »
Всё =) до меня дошло =)

mkarasik,
У него в самой xml'ке написано что utf-8
а ему отдают уже считанную utf8 преобразованную в широкие символы.
тоесть у него нормальный текст в широких символах уже


жесть. ну что я тебе могу посоветовать. придётся обратно сужать до char* с кодировке utf-8
или
искать парсер который схавает широкие символы
или
изменить тот код который считывает из файла пусть отдаёт байты как есть без преобразований

Оффлайн Дядюшка Ау

  • Автор темы
  • Участник
  • *
  • Сообщений: 123
  • Дайте две!
    • Просмотр профиля
Re: Работа с libxml2
« Ответ #7 : 06 Июня 2012, 09:25:13 »
Всё =) до меня дошло =)

mkarasik,
У него в самой xml'ке написано что utf-8
а ему отдают уже считанную utf8 преобразованную в широкие символы.
тоесть у него нормальный текст в широких символах уже


жесть. ну что я тебе могу посоветовать. придётся обратно сужать до char* с кодировке utf-8
или
искать парсер который схавает широкие символы
или
изменить тот код который считывает из файла пусть отдаёт байты как есть без преобразований


Именно так. Вчера бодался с iconv, получил на выходе красивые юникодные иероглифы :) Борьба продолжается:)
Ubuntu 12.04 для поколупацца, Win7 для поработать

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Работа с libxml2
« Ответ #8 : 06 Июня 2012, 10:13:24 »
При использовании xml2 правильный это последний вариант.

 

Страница сгенерирована за 0.098 секунд. Запросов: 25.