ansiToUtf8 не работает с конвертированными проектами Delphi XE из Delphi 7? - PullRequest
0 голосов
/ 10 мая 2011

Существует Oracle 9 db с настройкой кодовой страницы CL8MSWIN1251 и Delphi XE с некоторыми полями редактирования.

Мне нужно преобразовать проект, созданный в Delphi 7, в проект Delphi Xe, чтобы использовать и просматривать данные UTF8.

Итак, я открыл файл dpr, используя Delphi XE, и он автоматически конвертировался в dproj.Но когда я пытаюсь вставить в БД некоторые данные, я получаю символы вопроса ("?") Вместо некоторых символов utf8.Я пытался конвертировать данные из редактирования (Tedit) с помощью ansitoUTF8 (edit1.text).И это не работает.Затем я запустил новый проект в XE, быстро добавил некоторые правки для проверки функции ansitoutf8, она хорошо работает и вставляет данные в одну и ту же базу данных и в ту же таблицу.

Существует одно правило: я не могу изменить настройку кодовой страницы в базе данных,

begin
  adoquery1.close;
  adoquery1.sql.text:='insert into table (data1,data2) values ('+#39+ansitoUTF8(edit1.text)+#39+','+#39+ansitoUTF8(edit2.text)+#39+')';
  adoquery1.execsql;
end;

Есть предложения?

Ответы [ 2 ]

1 голос
/ 10 мая 2011

В Delphi XE имеется разрыв обратной совместимости с функцией AnsiToUTF8(), фактически в вызываемой ею функции Utf8Encode().

В Delphi XE возвращается строка RawByteString.Таким образом, вам придется принудительно установить тип результата в UTF8String.Например: UTF8String(ansitoUTF8(...)

Но я думаю, что это, возможно, не ваша проблема.

В вашем коде:

adoquery1.sql.text:='insert into table (data1,data2) values ('+#39+ansitoUTF8(edit1.text)+#39+','+#39+ansitoUTF8(edit2.text)+#39+')';

Выражение sql.text представляет собой UnicodeString, так что у вас будет явное преобразование, сделанное компилятором Delphi XE в вашем выражении конкатенации.

Работает ли следующая строка?

adoquery1.sql.text:='insert into table (data1,data2) values ('+#39+edit1.text+#39+','+#39+edit2.text+#39+')';

Она должна работать под XE, и преобразованиев UTF8 должен быть сделан VCL из raw UnicodeString.

1 голос
/ 10 мая 2011

CL8MSWIN1251 не является кодовой страницей UTF-8, является реализацией Oracle кодовой страницы Windows 1251 (кириллицы). Delphi XE всегда использует UTF-16. База данных Oracle и клиент могут выполнять преобразование набора символов. Вы должны правильно установить параметр NLS_LANG вашего клиента / сеанса. Если вы не хотите изменять кодовую страницу клиента, вы можете при входе в систему ALTER SESSION SET NLS_LANGUAGE = ... изменить ее только для этого сеанса. Для приложения XE Unicode с базой данных Oracle 9i вы можете использовать AL16UTF16 на стороне клиента, чтобы сообщить клиенту данные в формате UTF-16 и позволить Oracle выполнить их преобразования.

PS: код как

#39+ansitoUTF8(edit1.text)+#39+...

- лучший способ внедрения уязвимостей SQL-инъекций. Вы должны использовать переменные связывания или, по крайней мере, использовать такие функции, как QuotedStr / AnsiQuotedStr, которые гарантируют, что строки останутся строковыми и не станут командами SQL в чужих руках.

...