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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.10.2013, 09:36   #1
Suny-o
Пользователь
 
Аватар для Suny-o
 
Регистрация: 03.03.2012
Сообщений: 33
По умолчанию StringReplace косяк Delphi XE3 кто знает что делать?

В Delphi XE3

если в StringReplace установить оба флага rfReplaceAll, rfIgnoreCase

функция перестает понимать русские буквы и начинает глючить

(заменяя "Русские буквы" на ????? или другие неправильные символы), хотя заменяемую часть на русском продолжает понимать.

s2:=StringReplace(s1, 'Заменяемая часть', 'Русские буквы',[rfReplaceAll, rfIgnoreCase])

Было "АБВ" меняем на "яяя" получаем "yyy"
Было "абв" меняем на "ююю" получаем "???"

по отдельности
s2:=StringReplace(s1, 'Заменяемая часть', 'Русские буквы',[rfReplaceAll])
s2:=StringReplace(s1, 'Заменяемая часть', 'Русские буквы',[rfIgnoreCase])
работают корректно
QuickSortStr04.rar работа с динамическими 1D,2Dмассивами строк
* быстрая сортировка по любому алфавиту, добавление, удаление элементов.
* чтение, запись(файл<-->дин. массив)
Suny-o вне форума Ответить с цитированием
Старый 18.10.2013, 10:34   #2
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,887
По умолчанию

А исходная строка в какой кодировке? Это кому-нибудь известно?
northener вне форума Ответить с цитированием
Старый 18.10.2013, 11:16   #3
Suny-o
Пользователь
 
Аватар для Suny-o
 
Регистрация: 03.03.2012
Сообщений: 33
По умолчанию

Какая разница в какой - все работает нормально пока я оба флага [rfReplaceAll, rfIgnoreCase] не ставлю.
По моему кодировка ANSI, с юникодом программа вообще неработает.
QuickSortStr04.rar работа с динамическими 1D,2Dмассивами строк
* быстрая сортировка по любому алфавиту, добавление, удаление элементов.
* чтение, запись(файл<-->дин. массив)

Последний раз редактировалось Suny-o; 18.10.2013 в 11:27.
Suny-o вне форума Ответить с цитированием
Старый 18.10.2013, 11:21   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
А исходная строка в какой кодировке? Это кому-нибудь известно?
+1

а ещё, не исключено, что проблема напрямую связана с unicode...
AnsiString использовать не пытались?

попробуйте перевести вашу строку s1 в UpperCase, посмотрите на полученный результат. В зависимости от полученных результатов - и принимайте меры.


Код:
var 
  s111 : AnsiString;
....
  s111 := s1;
  
  s2:=StringReplace(s111, 'Заменяемая часть', 'Русские буквы',[rfReplaceAll, rfIgnoreCase]);
какой результат даёт?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 18.10.2013, 11:41   #5
Suny-o
Пользователь
 
Аватар для Suny-o
 
Регистрация: 03.03.2012
Сообщений: 33
По умолчанию

Код:
var 
  s111 : AnsiString;
....
  s111 := s1;
  
  s2:=StringReplace(s111, 'Заменяемая часть', 'Русские буквы',[rfReplaceAll, rfIgnoreCase]);
Результат такой же - чувствую просто пакет надо поменять.
QuickSortStr04.rar работа с динамическими 1D,2Dмассивами строк
* быстрая сортировка по любому алфавиту, добавление, удаление элементов.
* чтение, запись(файл<-->дин. массив)
Suny-o вне форума Ответить с цитированием
Старый 18.10.2013, 11:57   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

В XE2 есть
System.AnsiStrings.StringReplace для AnsiString
System.SysUtils.StringReplace для UnicodeString
а еще System.WideStrUtils.WideStringRepla ce для WideString

в XE3 не думаю что по другому. Какой StringReplace у вас?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.10.2013, 11:41   #7
Suny-o
Пользователь
 
Аватар для Suny-o
 
Регистрация: 03.03.2012
Сообщений: 33
По умолчанию

Я написал аналог StringReplace - точную копию FRstr, сейчас это часть библиотеки
QuickSortStr 2.0 - посмотреть FRstr можно здесь

Функция работает нормально - проверял на строках Memo4 Memo5
Но глюки остались те же, выяснилось что по какой то причине глючит
Writeln(f2,s2) - отладчик до момента записи показывает в списке переменных нормальную строку с корректной заменой букв строки s2 без глюков и кракозябр а уже после записи в файл происходит что то не понятное.

Можно предположить что и функция StringReplace работает корректно.

Есть ли функция - аналог Writeln(f2,s2)?

Пока мне не ясно что вообще происходит и где косяк - как я уже говорил если писать флаги для функции StringReplace по одиночке в файл записываются нормальные буквы тоже самое касается новой функции FRstr
s2:=FRstr(s1, FromS1, ToS2,[rfReplaceAll]);
s2:=FRstr(s1, FromS1, ToS2,[rfIgnoreCase]);
В такой постановке все работает нормально, но совместите эти два флага и появляется - ошибка.
QuickSortStr04.rar работа с динамическими 1D,2Dмассивами строк
* быстрая сортировка по любому алфавиту, добавление, удаление элементов.
* чтение, запись(файл<-->дин. массив)

Последний раз редактировалось Suny-o; 21.10.2013 в 12:06.
Suny-o вне форума Ответить с цитированием
Старый 21.10.2013, 12:32   #8
Suny-o
Пользователь
 
Аватар для Suny-o
 
Регистрация: 03.03.2012
Сообщений: 33
По умолчанию

Я уже написал функцию Чистилище для строки - я только выяснил что строковые переменные тут не причем с вероятностью 95%

Код:
//Функция чистилище - из самой себя делает чистую строку
function PurgatoryStr(s1:string):string;
const Source='0123456789~!@#$%^&*()_+|`!"№;%:?*()=\/,.<>{}[];:abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZабвгдеёжзиклмнопрстуфхцчшщъьыэюяАБВГДЕЁЖЗИКЛМНОПРСТУФХЦЧШЮЪЬЫЭЮЯ'+chr(39);
var n,ns:integer;
begin
result:='';
for n := 1 to length(s1) do
  begin
    ns:=pos(s1[n],Source);
    result:=result+Source[ns];
  end;
end;
Не помогло глюк остался
QuickSortStr04.rar работа с динамическими 1D,2Dмассивами строк
* быстрая сортировка по любому алфавиту, добавление, удаление элементов.
* чтение, запись(файл<-->дин. массив)
Suny-o вне форума Ответить с цитированием
Старый 20.12.2013, 04:29   #9
Suny-o
Пользователь
 
Аватар для Suny-o
 
Регистрация: 03.03.2012
Сообщений: 33
По умолчанию

Я окончательно разобрался с этим вопросом - я поставил Delphi XE5 и там все работает нормально.
QuickSortStr04.rar работа с динамическими 1D,2Dмассивами строк
* быстрая сортировка по любому алфавиту, добавление, удаление элементов.
* чтение, запись(файл<-->дин. массив)
Suny-o вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
тема-кубик рубика!может кто-то знает как делать? сега21 Помощь студентам 1 20.05.2012 13:57
кто-нибудь знает каааак делать?? :( многочлен.динамический список(Delphi) tralala Помощь студентам 0 09.05.2012 00:18
Кто что знает и кто скока получает? Marsel737 Свободное общение 23 12.04.2011 10:16
No_name (кто что знает) ToHuK13 Общие вопросы C/C++ 0 06.05.2010 22:13
Прошу помощи ! Люди отзовитесь пожалуйста кто знает что делать ! Jenya1982 JavaScript, Ajax 2 29.08.2008 23:17