Как присвоить переменной char значение в UTF8 кодировке?

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

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

Как присвоить переменной char значение в UTF8 кодировке?

Сообщение Александр Яшин » 27.12.2009 14:46:48

Здравствуйте!
Всех с наступающим!
При попытке присвоить переменной типа char значения с кодом больше 128 (конкретно русская буква) выдается ошибка:
p.lpr(7,10) Error: Incompatible types: got "Constant String" expected "Char"

Код: Выделить всё
program p;
uses
  CRT, FileUtil;
var
  Symbol: Char;
begin
Symbol:= 'А'; // это русская буква
....
 


Английские буквы и знаки нормально прокатывает.
Как все-таки присвоить. Знаю, что русские буквы кодируются двумя байтами, но неужели придется лезть в таблицу кодов Unicode?
Александр Яшин
новенький
 
Сообщения: 67
Зарегистрирован: 21.11.2009 09:31:01

Re: Как присвоить переменной char значение в UTF8 кодировке?

Сообщение Brainenjii » 27.12.2009 15:05:32

Использовать UTF8Char?
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Как присвоить переменной char значение в UTF8 кодировке?

Сообщение Александр Яшин » 27.12.2009 15:37:33

Brainenjii писал(а):Использовать UTF8Char?


В каком она модуле?
Выдает - Error: Identifier not found "UTF8Char"
Александр Яшин
новенький
 
Сообщения: 67
Зарегистрирован: 21.11.2009 09:31:01

Re: Как присвоить переменной char значение в UTF8 кодировке?

Сообщение sign » 27.12.2009 16:24:17

А если так:
Код: Выделить всё
program p;
uses   CRT, FileUtil;
var   Symbol: String[2];
begin
  Symbol:= 'А'; // это русская буква
....
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

Re: Как присвоить переменной char значение в UTF8 кодировке?

Сообщение Александр Яшин » 27.12.2009 17:17:05

Нет, ну это понятно. Хотелось с именно с типом char.
По умолчанию Lazarus использует UTF8, отсюда тип string уже в кодировке UTF8, т.е. русские символы занимают 2 байта.
По идее то же самое должно было быть и с char.
Александр Яшин
новенький
 
Сообщения: 67
Зарегистрирован: 21.11.2009 09:31:01

Re: Как присвоить переменной char значение в UTF8 кодировке?

Сообщение Максим » 27.12.2009 18:05:41

Единственным выходом из данной ситуации мне видится использование функций UTF8ToAnsi/UTF8ToSys.
Аватара пользователя
Максим
энтузиаст
 
Сообщения: 598
Зарегистрирован: 27.07.2007 01:51:43
Откуда: Москва

Re: Как присвоить переменной char значение в UTF8 кодировке?

Сообщение Александр Яшин » 27.12.2009 18:10:37

Ты имеешь ввиду вот так:
Код: Выделить всё
Symbol:=UTF8ToAnsi('А');


Error: Incompatible types: got "AnsiString" expected "Char"
Александр Яшин
новенький
 
Сообщения: 67
Зарегистрирован: 21.11.2009 09:31:01

Re: Как присвоить переменной char значение в UTF8 кодировке?

Сообщение Максим » 27.12.2009 18:43:04

Попробуйте
Код: Выделить всё
Symbol:=Char(UTF8ToAnsi('А'));
Аватара пользователя
Максим
энтузиаст
 
Сообщения: 598
Зарегистрирован: 27.07.2007 01:51:43
Откуда: Москва

Re: Как присвоить переменной char значение в UTF8 кодировке?

Сообщение Александр Яшин » 27.12.2009 19:00:35

Максим писал(а):Попробуйте
Код: Выделить всё
Symbol:=Char(UTF8ToAnsi('А'));

Error: Illegal type conversion: "AnsiString" to "Char"
Александр Яшин
новенький
 
Сообщения: 67
Зарегистрирован: 21.11.2009 09:31:01

Re: Как присвоить переменной char значение в UTF8 кодировке?

Сообщение Odyssey » 27.12.2009 19:02:25

А если так:
Код: Выделить всё
Symbol:=UTF8ToAnsi('А')[1];

Или вообще сохранить исходник в windows-1251 и не мучаться :)

Александр Яшин писал(а):По умолчанию Lazarus использует UTF8, отсюда тип string уже в кодировке UTF8, т.е. русские символы занимают 2 байта. По идее то же самое должно было быть и с char.

Просто char -- это не совсем Lazarus, это FPC. Т.е. другой проект, и он немного медленнее реагирует на потребность в полном юникоде. Поэтому пока выкручиваемся используя string[4] или просто string вместо char. За полученную простоту локализации приложений это очень малая цена :)
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: Как присвоить переменной char значение в UTF8 кодировке?

Сообщение Александр Яшин » 27.12.2009 19:24:01

Odyssey писал(а):А если так:
Код: Выделить всё
Symbol:=UTF8ToAnsi('А')[1];



Так компилируется, но в Symbol нечитаемый символ!
При [2] тоже нечитаемый символ, хотя может быть так правильней.
При [3] Symbol=P (?!)

Odyssey писал(а):Или вообще сохранить исходник в windows-1251 и не мучаться


В принципе я не мучаюсь, хочу просто разобраться. Похоже тип char в Unicode поддерживается
только для кодов < 128
Александр Яшин
новенький
 
Сообщения: 67
Зарегистрирован: 21.11.2009 09:31:01

Re: Как присвоить переменной char значение в UTF8 кодировке?

Сообщение Padre_Mortius » 27.12.2009 19:29:11

TUTF8Char и в модулях добавить LCLType
Padre_Mortius
энтузиаст
 
Сообщения: 1265
Зарегистрирован: 29.05.2007 17:38:07
Откуда: Спб

Re: Как присвоить переменной char значение в UTF8 кодировке?

Сообщение Александр Яшин » 27.12.2009 19:43:36

Получилось!Спасибо!

Только как быть с тем, что вроде бы FPC совместим с Delphi?
Или там тоже так надо делать?
Александр Яшин
новенький
 
Сообщения: 67
Зарегистрирован: 21.11.2009 09:31:01

Re: Как присвоить переменной char значение в UTF8 кодировке?

Сообщение Odyssey » 27.12.2009 19:49:48

Александр Яшин писал(а):Так компилируется, но в Symbol нечитаемый символ!

Без примера тут будет проблематично разобраться. "Читаемый" и "нечитаемый" -- понятия относительные, зависят от того как выводить, куда выводить и под какой ОС всё это происходит. Если выводить на форму -- то для читабельности нужно его преобразовывать обратно в UTF-8 вне зависимости от платформы, в консоль под Linux -- тоже чаще всего в UTF-8, в в консоль под Windows -- в кодировку OEM Cyrillic (866).

Александр Яшин писал(а):Похоже тип char в Unicode поддерживается только для кодов < 128

Тип char и Unicode -- это две разные вещи. Char - это кусочек памяти размером ровно в один байт. Юникод - это способ кодирования символов, его конкретная разновидность, UTF-8, требует от одного до четырёх байт памяти на один символ. По одному байту -- на символы латиницы, для совместимости, на кириллицу - по два, на восточные кодировки -- 3 и 4 байта. Разумеется, что любой символ UTF-8 не влезет в один байт переменной типа char. Это всё равно что переливать воду из четырёхлитрового бочонка в литровую банку. Если в бочонке было меньше литра (читай "< 128") -- наше счастье, но полагаться на это никоим образом нельзя.

И кстати, можете заглянуть в исходники и посмотреть, что такое TUTF8Char :) Ctrl+щелчок мышкой на типе переменной.
Код: Выделить всё
TUTF8Char = String[7];
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: Как присвоить переменной char значение в UTF8 кодировке?

Сообщение Александр Яшин » 27.12.2009 20:06:26

Odyssey писал(а):Без примера тут будет проблематично разобраться. "Читаемый" и "нечитаемый" -- понятия относительные, зависят от того как выводить, куда выводить и под какой ОС всё это происходит.

Я, наверное, не так выразился.
При выводе оператором
Код: Выделить всё
writeln(UTF8ToConsole(Symbol));

на экране пусто. Платформа Windows.
Odyssey писал(а):Тип char и Unicode -- это две разные вещи.

Здесь я как раз и имел в виду, что "Если в бочонке было меньше литра (читай "< 128") -- наше счастье"
Александр Яшин
новенький
 
Сообщения: 67
Зарегистрирован: 21.11.2009 09:31:01

След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3

Рейтинг@Mail.ru