Уникод UTF8 стринг, Linux, RU_ru.utf8, FPC

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
cr0acker
новенький
Сообщения: 13
Зарегистрирован: 09.11.2006 00:59:09

Уникод UTF8 стринг, Linux, RU_ru.utf8, FPC

Сообщение cr0acker »

Доброго времени суток уважаемый ALL.
Возможно гуру данного форума помогут мне решить проблему.
Есть текстовой файл в с русскуими буквами в кодировек UTF8, вида

Код: Выделить всё

Адыгея                                  :Респ      :0100000000000:385000:0100:    :79000000000:0:
Башкортостан                            :Респ      :0200000000000:450000:0200:    :80000000000:0:
Алтай                                   :Респ      :0400000000000:649000:0400:    :84000000000:0:
Ингушетия                               :Респ      :0600000000000:386000:0600:    :26000000000:0:

При чтении его длина анси строки полученной как length(UTF8toAnsi(tempstring) сотавляет всегда 97 символов,
длина строки в формате utf8 полученного в виде length(tempstring) составляет от 100 до 120 симоволов в зависимости от того сколько двухбайтных символов занимают русские буквы в первой колокне. Соответственно при использования функций delete, copy и других для работы со строками приодится то же переводить строки с которыми ты работаеш в Анси, а при преобразовании русский язык соответсвенно теряется, може есть у кого аналог этих функций нормально работающих с utf8.
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

В модуле LCLProc есть аналоги данных функций для работы с UTF-8.
UTF8*
cr0acker
новенький
Сообщения: 13
Зарегистрирован: 09.11.2006 00:59:09

Сообщение cr0acker »

Ок, а я есть в фрипаскале паскале UFT8ой pchar? Просто если деалать преобразования и string(c русским UTF8) в pchar с помощью функции pchar русский текст пропадает/
Mr.Smart
долгожитель
Сообщения: 1796
Зарегистрирован: 29.03.2008 00:01:11
Откуда: из леса!

Сообщение Mr.Smart »

Код: Выделить всё

var
  s: String; // строка в UTF-8
  p: PChar;
begin
  p:=PChar(s);
....

Ничего не пропадает.
v-t-l
энтузиаст
Сообщения: 744
Зарегистрирован: 13.05.2007 16:27:22
Откуда: Belarus

Сообщение v-t-l »

cr0acker писал(а):если деалать преобразования и string(c русским UTF8) в pchar с помощью функции pchar русский текст пропадает

никакого преобразования строки не происходит:

Код: Выделить всё

var
  s: string;
  p1,p2: PChar;
begin
  s := 'some string';
  p1 := PChar(s);
  p2 := @s[1];
  writeln('p1=', Int64(p1)); //int64 - на случай 64-битной платформы :)
  writeln('p2=', Int64(p2));
  readln;
end.

- PChar(s) - тоже самое, что адрес первого символа в строке.
cr0acker
новенький
Сообщения: 13
Зарегистрирован: 09.11.2006 00:59:09

Сообщение cr0acker »

Ок не пропадает. Пропадает где то в другом месте. Почему при работе с Mysql с установками

Код: Выделить всё

SQuery1:PChar='set character_set_client='+#39+'utf8'+#39+';';
SQuery2:PChar='set character_set_results='+#39+'utf8'+#39+';';
SQuery3:PChar='set collation_connection='+#39+'utf8_unicode_ci'+#39+';';
SQuery4:Pchar='set character_set_connection='+#39+'utf8'+#39+';';

Запрос из базы выполняется нормально и русский язык виден, а в случае запроса добавляющего записи вместо русского языка в базу попадают знаки вопроса, хотя если с помощью wrteln его вывести на экран, то с русским всё ок, так же если скопипастить получившийся запрос ручками в БД, то всё с русским то же всё ок.
Скажем запросы выведенный в консоле с помощью writeln выглядт так:

Код: Выделить всё

INSERT INTO russ_regs VALUES('85','РЕСП','Дагестан','05');

SLECT * FROM russ_regs выглядет такЖ

Код: Выделить всё

| 85     | ????     | ????????                                 | 05     |
, если же квери выполнить ручками, то рузультат будет

Код: Выделить всё

85     | РЕСП | Дагестан                         | 05     |
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

cr0acker
А каким образом Вы запрос серверу посылаете?
cr0acker
новенький
Сообщения: 13
Зарегистрирован: 09.11.2006 00:59:09

Сообщение cr0acker »

Вот таким:

Код: Выделить всё

uses mysql50

.....

Код: Выделить всё

querystring:='INSERT INTO russ_regs VALUES('+#39+result[i].number+#39+','+#39+result[i].form+#39+','+#39+result[i].name+#39+','+#39+result[i].prefix+#39+ ');';
if (mysql_query(sock,pchar(querystring)) < 0) then begin
        Writeln (stderr,'Query failed ');
        writeln (stderr,mysql_error(sock));
        Halt(1);
      end;

Аватара пользователя
AbakAngelSoft
постоялец
Сообщения: 273
Зарегистрирован: 06.08.2008 19:28:26
Откуда: Краснодар
Контактная информация:

Сообщение AbakAngelSoft »

запрос SET NAMES перед обменом данными с mysql выполнен? какая кодировка указана?

Добавлено спустя 2 минуты 49 секунд:
и для запросов
SQuery1:PChar='set character_set_client='+#39+'utf8'+#39+';';
SQuery2:PChar='set character_set_results='+#39+'utf8'+#39+';';
SQuery3:PChar='set collation_connection='+#39+'utf8_unicode_ci'+#39+';';
SQuery4:Pchar='set character_set_connection='+#39+'utf8'+#39+';';

проверили что папка с локализацией utf8 называется именно так? у меня на одной машине utf8, а на другой UTF-8
Ответить