![]() |
|
![]() ![]() ![]() |
|
ipc |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 21.10.2010 Репутация: 1 Всего: 1 |
Доброго времени суток, господа. Помогите, пожалуйста, разобраться с проблемой. Почему русский текст моим приложением понимается как абракадабра (не вопросики).
Я заканчиваю курсовой проект, в котором часть мультиязычного функционала состоит в том, чтобы обращаться к удаленной базе данных. Для этого была выбрана кодировка utf8. На стороне сервера MySQL, PHP На стороне клиента Embarcadero Builder 2010 (с базовой Indy) Все таблицы MySQL, и поля в них, со сравнением utf8_general_ci. Код обращения на Билдере:
Неисключено, что тему кодировки я не до конца понимаю, потому как безрезультатно гуглю уже третьи сутки, а сроки безжалостно поджимают. Если я все правильно понимаю, то: - utf8 на то и такая громоздкая, чтобы в ней можно было передавать все символы большиства языков. - Builder и Delphi 2010, как объявлено, заточены для работы с юникодом. Из этого всего получается, что преобразовывать к локализации ansi мне не требуется, достаточно полученную юникодовскую строку подать, допустим, в мемо, а оно отобразит как надо. Или не так? P/s/ абракадабру я копипастнул в файл и открыл lister'ом, он отобразил русский текст если указать, что он в UTF-8. Подскажите, пожалуйста, в чем может быть ошибка, или куда копать, я уже, пожалуй, все перепробывал(( Заранее, спасибо! |
|||
|
||||
xvr |
|
||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 48 Всего: 223 |
UTF8 это способ кодировки Unicode символов (которые сами по себе 2х байтовые) в виде потока байтов.
|
||||
|
|||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 26 Всего: 459 |
Билдер должен знать что к нему пришла строка в формате UTF8, только тогда он сможет корректно конвертировать ее в utf16 для отображения на windows контролах.
Для таких строк предусмотрен тип UTF8String. Строка как набор байтов это RawString . При копировании в RawString не осуществляются ни какие преобразования. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
ipc |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 21.10.2010 Репутация: 1 Всего: 1 |
Спасибо, за такой быстрый ответ.
Т.е. получается (подведу вышесказанные ответы), что у меня приходит строка utf8, а в мемо отображается в utf16. И надо конвертировать как-то в utf16 потому как билдер не понимает, что в мемо подается строка utf8. Так? Пробывал следующие конструкции :
не помогают((((( Как быть? |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 26 Всего: 459 |
Ничего не нужно конвертировать, он сам все умеет, важно, чтобы изначально получить строку в правильном формате. Скорее всего в строке utf16 хранятся данные не соответствующие контейнеру. Значит нужно создать контейнер правильного типа(UTF8String), зарезервировать необходимую память и побайтово скопировать туда (например при помощи memcpy). После этого все операции будут корректными. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
ipc |
|
||||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 21.10.2010 Репутация: 1 Всего: 1 |
Сделал следующее:
Результат не изменился..... Символы в контролле те же. |
||||
|
|||||
Alexeis |
|
||||||||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 26 Всего: 459 |
Для начала соответствуют ли тут типы? Если нет то произойдет конвертация с потерей информации
Во-вторых чеза?
Где тут конструктор умеющий выделять длину?
В третьих почему начало объекта должно совпадать с началом строки? И почему размер памяти равен длине строки?
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
||||||||
|
|||||||||
ipc |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 21.10.2010 Репутация: 1 Всего: 1 |
Да, типы соответствуют.
Alexeis, спасибо, все исправил. Теперь:
Результат изменился, но теперь вместо привычной абракадабры в несколько предложений выдало всего несколько символов " \ ?" и все. Я что-то снова не то сделал? |
|||
|
||||
oldcode |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 116 Регистрация: 8.10.2010 Репутация: 0 Всего: 0 |
Это сообщение отредактировал(а) oldcode - 21.10.2010, 19:20 |
|||
|
||||
ipc |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 21.10.2010 Репутация: 1 Всего: 1 |
oldcode, не совсем понял, что ты хотел этим сказать)
|
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 26 Всего: 459 |
ipc, если там текст английский, то utf8 совпадает с ansi и его должно быть видно в отладчике. Нужно проверить что в самой первой строке правильный текст.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
ipc |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 21.10.2010 Репутация: 1 Всего: 1 |
Alexeis,сделал, чтобы возвращался смешанный текст (сначала пара слов английского, затем русский).
В отдладчике srcStr показывает эту пару слов английского, затем ту же абракадабру. После memcpy dstStr равна первому символу из srcStr и символу конца строки. Т.е. исходный текст: "English text. Русский текст". srcStr: "English text. Р СѓСЃСЃРєРёР№ текст" dstStr: "E\0" |
|||
|
||||
Platov |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 23.7.2009 Репутация: 2 Всего: 2 |
||||
|
||||
oldcode |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 116 Регистрация: 8.10.2010 Репутация: 0 Всего: 0 |
||||
|
||||
ipc |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 21.10.2010 Репутация: 1 Всего: 1 |
Platov, Utf8ToAnsi я пробывал, как только появилась проблема. Эта функция возращает пустую строку((
К тому же, зачем мне в Ansi переводить, если контроллы в 2010 версии понимают в первую очередь юникод? |
|||
|
||||
Platov |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 23.7.2009 Репутация: 2 Всего: 2 |
||||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 26 Всего: 459 |
Хм... что-то похоже неверно с источником. Проверил у себя помещаю uft8 в UnicodeString получаю не читаемый английский текст. И это правильно, потому что он рассматривает 2 символа как 1.
u8str - "english СЂСѓСЃСЃРєРёР№" s - { "湥汧獩胑菑臑臑뫐룐말ȀText=\"Фон" } Мои оба результата предсказуемы. Это значит что в StrStreamInc->DataString уже пострадавший текст от конвертации Ansi -> utf16 ; Indy ожидал встретить Ansi и записал буфер как Ansi, после чего сам произвел конвертацию в юникод и тем самым испортил данные. Можно попробовать следующий вариант. Убитый Utf8 в контейнере UTF16 сконвертить обратно в Ansi затем буфер данных Ansi скопировать в контейнер для UTF8. Но работать будет 50/50. Дело в том, что при порче данных запросто могут появиться символы не существующие в кодировке Ansi, поэтому при обратном преобразовании они заменяться на квадратики. Те же что имеют эквивалент восстановятся верно. Вердикт. Использовать другой способ который даст доступ к исходному буферу и не произведет порчу данных. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
ipc |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 21.10.2010 Репутация: 1 Всего: 1 |
ЕСТЬ!!!!
Всем СПАСИБО, огромнейшее!!! Alexeis, в частности, за терпение и разъяснение. oldcode, очень полезная ссылка, решила проблему в раз! Добавлено через 4 минуты и 29 секунд Еще раз всем спасибо ребят Platov, Alexeis, oldcode. |
|||
|
||||
oldcode |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 116 Регистрация: 8.10.2010 Репутация: 0 Всего: 0 |
покажи, как переписАл на ВСВ, а то не вникал ![]() Это сообщение отредактировал(а) oldcode - 22.10.2010, 13:57 |
|||
|
||||
ipc |
|
|||
Новичок Профиль Группа: Участник Сообщений: 30 Регистрация: 21.10.2010 Репутация: 1 Всего: 1 |
Вот. Правда без Utf8ToAnsi все же не обошлось, а жаль, чувствую, это еще выйдет мне боком при парсинге.
|
|||
|
||||
0x00 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 192 Регистрация: 3.4.2006 Репутация: нет Всего: нет |
все не читал но скорее всего проблема на стороне скрипта.
там надо чтонибудь типа (Java) request.setCharacterEncoding("UTF-8"); поставить |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++ Builder" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C++ Builder | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |