Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2015, 17:48   #1
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию ideone, FreePascal и русские буквы в UTF8

господа-товарищи.

Просветите, пожалуйста, кто разбирается.
как в ideone c его "Free Pascal Compiler version 2.6.4+dfsg-4 [2014/10/14] for i386"
вывести строку с кириллицей посимвольно?

ну, т.е. как сделать код:
Код:
program ideone;
var 
  s : String;
  i, len2 : integer;
begin
  s := 'Test Проблема с UTF8';
  len2 := Length(UTF8ToAnsi(s)); 
  WriteLn('len = ', Length(s), ' len2 = ', len2);
  for i:=1 to len2 do
    // Write(Copy(s,i,1),'|');
  WriteLn  
end.
работоспособным (почему то, если раскомментировать строку 10, то вообще вывод не производится)?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.05.2015, 19:48   #2
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
почему то, если раскомментировать строку 10, то вообще вывод не производится
Внимание! Первый раз разбираюсь с кодировками, посему верить крайне не рекомендую

Фишка в чем.. В неравномерности UTF8..
Давайте будем выводить коды символов, а не их графическое представление. Тогда получаем, что с ланинскими символами и цифрами все прекрасно. Косяк начинается с нашими. Смотри их кодировку. Вылезает еще один бит со значением 208 (я пока не понял что он делает).
Он служебный. И если мы попытаемся его одного вывести, то он испачкает нам весь экран (надо будет с файликом проверить). А если мы найдем ему пару, то все прекрасно
У Вас же 20-ый символ был именно 208-ой. Вот и получали Вы ничего.

Теперь про вывод. Если это не критично, предлагаю так : тыц
А если не ахти, то можно проверять символ на равенство 208 и там уже или продолжать
Poma][a вне форума Ответить с цитированием
Старый 06.05.2015, 19:55   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Только это помогло String[255], а так ор, что нет функций типа UTF8Length и прочих.
Код:
program ideone;
var 
  s : String[255];
begin
  s := 'Test Проблема с UTF8';
  for i:=1 to length(s) do Write(Copy(s,i,1),'|');
  WriteLn;  
end.
Но это не UTF8
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 06.05.2015 в 19:59.
Аватар вне форума Ответить с цитированием
Старый 06.05.2015, 20:40   #4
Vapaamies
Просветитель
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,844
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
вывести строку с кириллицей посимвольно?
Если строка в UTF-8, то либо никак, либо раскодируя UTF-8 вручную в кодовые точки и кодируя обратно в UTF-8 для вывода на экран. Или частично, проверяя лишь старшие биты лидирующего байта. В Википедии всё есть.

По стандарту Unicode байтовые последовательности UTF-8 являются единым целым, разбивать их нельзя. Неполные последовательности считаются битыми и должны валить ошибку или заменяться символом U+FFFD.
В разработке: воспроизводственный контур ИТ
Vapaamies вне форума Ответить с цитированием
Старый 06.05.2015, 22:47   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Всем отписавшимся в теме БОЛЬШОЕ СПАСИБО!

Poma][a, да, вижу, что Вы открыли для себя unicode.
Спасибо за пример кода.
как workaround вполне себе годится.
Только обратите внимание на пост Vapaamies (в Unicode бывают не только двухбайтные символы, как в случае кириллицы, но и даже трёхбайтные).

Аватар, простите, а Вы свой пример пробовали именно на http://ideone.com ?
я и ранее подобное пытался сделать.
И у меня он не заработал! тыц


Vapaamies, ну да, Вы правы. прямо засада с этим UTF8
"либо раскодируя UTF-8 вручную в кодовые точки и кодируя обратно в UTF-8 для вывода на экран"
вот, я надеялся, что в FPC что-то подобное есть в стандартных модулях/функциях.
Но, похоже, что я ошибался.

Ладно.
В целом всё понятно.
ещё раз спасибо.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.05.2015, 22:55   #6
Poma][a
Новичок
Джуниор
 
Регистрация: 11.10.2011
Сообщений: 3,882
По умолчанию

Цитата:
вот, я надеялся, что в FPC что-то подобное есть в стандартных модулях/функциях.
А они вроде как есть.. Только вот у меня с русскими не заработали..
тыц
Цитата:
Poma][a, да, вижу, что Вы открыли для себя unicode.
Ага. Несамый удачный опыт
Poma][a вне форума Ответить с цитированием
Старый 07.05.2015, 06:45   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
свой пример пробовали именно на http://ideone.com ?
Ага, но наверно руки кривые, вчера получил, сегодня нет. Даже понял почему
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 07.05.2015, 07:06   #8
Vapaamies
Просветитель
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,844
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
(в Unicode бывают не только двухбайтные символы, как в случае кириллицы, но и даже трёхбайтные).
Внесу уточнение. В Unicode бывают только кодовые точки, записываемые в форме U+######, где вместо решеток стоят шестнадцатиричные цифры, которых может быть от 4 до 6. Сам Unicode как стандарт определяет только кодовые точки, и они не имеют размерности, типа как числа в математике. Размерность появляется при переходе к форматам трансформации -- UTF, которые кодируют кодовые точки физическими байтами, словами или двойными словами с определенным порядком байт.

А конкретно в UTF-8 бывают не только двух- и трех-, но и четырехбайтные последовательности, причем используются они не только для редких китайских иероглифов, но и вполне русских смайликов, кодировку для которых придумали японцы.

По идее, для UTF-8 должна быть своя реализация TEncoding или чего-то похожего, имеющая процедуры CharPrev и CharNext для посимвольного перебора туда-сюда. Есть ли такое в FPC, не скажу, ищите сами.

А вообще про посимвольную обработку нужно забыть и работать с текстом как с текстом. На кой понадобилось его посимвольно в консоль выводить, например?
В разработке: воспроизводственный контур ИТ
Vapaamies вне форума Ответить с цитированием
Старый 07.05.2015, 08:02   #9
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
program ideone;
var s : String;
    i : integer;
begin
  s := 'Test Проблема с UTF8';
  for i:=1 to Length(UTF8Decode(s)) do Write(UTF8Encode(Copy(UTF8Decode(s),i,1)),'|');
end.
Изображения
Тип файла: jpg Безымянный.jpg (21.9 Кб, 134 просмотров)
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 07.05.2015, 11:56   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Аватар, гениально! это то, что я пытался сделать и не смог!!!!
БОЛЬШОЕ СПАСИБО!

Vapaamies, спасибо за ликбез. Познавательно.
только с этим
Цитата:
А вообще про посимвольную обработку нужно забыть и работать с текстом как с текстом.
Не, тут не соглашусь. Как-то исторически сложилось, что строка у нас состоит из отдельных элементов (мы их называем символами строки). И очень часто стоит задача именно получить часть строки или отдельный символ.
Вот, например, пара простейших (классических) задач:
1) определить, сколько в заданном тексте одинаковых соседних букв. (собственно, я эту задачу и пытался решить, когда наступил на грабли с unicode)
2) дано слово. Определить, является ли оно палиндромом.
3) дано слово. Получить все возможные перестановки символов данного слова
и это так, первое, что пришло в голову...
Да и в практической жизни часто нужно получить какую-то часть строки (подстроку).


p.s. Вот, теперь уже думаю, что тему можно закрывать. Возражений против закрытия нет, надеюсь?
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
PAnsiChar utf8 русские буквы ? Должно быть имя? Общие вопросы Delphi 26 01.05.2015 15:21
Русские буквы в консоле С++ Aleksander550 Помощь студентам 4 04.07.2014 10:33
Русские буквы morgan97 Паскаль, Turbo Pascal, PascalABC.NET 4 10.03.2011 10:15
Русские буквы в программе Rusl_v Общие вопросы C/C++ 5 16.01.2011 19:06