![]() |
|
![]() ![]() ![]() |
|
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 версии понимают в первую очередь юникод? |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++ 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. |