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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.04.2025, 20:05   #1
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 684
По умолчанию Проблема с функцией UTF8ToAnsi

С функцией UTF8ToAnsi возникла проблема
Когда в строке содержится какой-то "запретный" символ, которого нет в Ansi, то "бракуется" вся строка...
Отсюда вопрос: как сделать так, чтобы остальная строка передавалась нормально, без битых символов?
Kronos913 вне форума Ответить с цитированием
Старый 26.04.2025, 15:40   #2
DeepFlake
Форумчанин
 
Регистрация: 16.05.2024
Сообщений: 186
По умолчанию

Какая версия Delphi?
Вся строка браковаться не должна.
Если вместо русских букв появляются знаки вопроса, то это следствие того, что в текущей кодовой странице текста нет тех символов, которые вы пробуете показать.
DeepFlake вне форума Ответить с цитированием
Старый 26.04.2025, 15:45   #3
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 684
По умолчанию

Delphi 7

В том то и дело, что не знак вопроса, а просто если хоть один проблемный символ - то на выходе пустая строка
Kronos913 вне форума Ответить с цитированием
Старый 26.04.2025, 17:12   #4
DeepFlake
Форумчанин
 
Регистрация: 16.05.2024
Сообщений: 186
По умолчанию

Код:
var s, ch: String;
 ...
for ch in s do
   writeln('ch=',ch);
для юникода тоже должен работать
DeepFlake вне форума Ответить с цитированием
Старый 26.04.2025, 17:20   #5
DeepFlake
Форумчанин
 
Регистрация: 16.05.2024
Сообщений: 186
По умолчанию

Можно вот так ещё:

Iterating over string analysing individual codepoints
This code copies each codepoint into a variable of type String which can then be processed further.

Код:
procedure IterateUTF8(S: String);
var
  CurP, EndP: PChar;
  Len: Integer;
  ACodePoint: String;
begin
  CurP := PChar(S);        // if S='' then PChar(S) returns a pointer to #0
  EndP := CurP + length(S);
  while CurP < EndP do
  begin
    Len := UTF8CodepointSize(CurP);
    SetLength(ACodePoint, Len);
    Move(CurP^, ACodePoint[1], Len);
    // A single codepoint is copied from the string. Do your thing with it.
    ShowMessageFmt('CodePoint=%s, Len=%d', [ACodePoint, Len]);
    // ...
    inc(CurP, Len);
  end;
end;
То есть пробегают по каждому символу в строке , копируют его в ACodePoint . А вы его можете присоединять к новой строке, то есть сделать свою реализацию UTF8ToAnsi
------

Вот ещё

Iterating over string looking for ASCII characters
If you only want to find characters in ASCII-area, you can use Char type and compare with Txt[i] just like in old times. Most parsers do that and they continue working.

Код:
procedure ParseAscii(Txt: string);
var
  i: Integer;
begin
  for i:=1 to Length(Txt) do
    case Txt[i] of
      '(': Что-то делать;
      ')': что-то сделать;
    end;
end;

Последний раз редактировалось DeepFlake; 26.04.2025 в 17:23.
DeepFlake вне форума Ответить с цитированием
Старый 27.04.2025, 14:30   #6
Kronos913
Форумчанин
 
Регистрация: 10.02.2021
Сообщений: 684
По умолчанию

Код:
то есть сделать свою реализацию UTF8ToAnsi
По сути, так и пришлось делать - пилить свою версию преобразователя.

Сначала прогнал все char'ы от #32 до #255, чтобы посмотреть какой у них код в UTF8, а потом создать на основе этих данных декодер
Kronos913 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
utf8toansi не работает в DelphiXE? Ship_1 Общие вопросы Delphi 13 17.12.2017 17:50
Проблема с кодировкой (перенёс utf8toansi из 7 в XE) Ship_1 Общие вопросы Delphi 14 22.09.2017 20:26
ПРоблема с функцией! dpmkh Общие вопросы Delphi 6 12.10.2012 18:42
Проблема с функцией MeTeOpA C# (си шарп) 6 11.07.2011 00:07
Проблема с функцией pos. men232 Помощь студентам 6 01.07.2011 20:55