Orion9

|
Posted: Tue Oct 06, 2026 20:49 Post subject: |
|
|
AkulaBig
Ситуация с индексами, как я понял, примерно такая.
Когда поля создаются через Pragma AutorunPluginFields первому полю присваивается первый индекс и т.д. по порядку. Если объявить 60 полей С1-С60, то индекс=52 должен вернуть значение С52 и т.д. Но если объявить что-то перед С1-С60, то индекс сместится, т.е. индекс=52 уже не вернет значение поля С52, а вернет индекс другого, соседнего поля. Поэтому, создавая группу полей, где важно сохранить индекс в первоначальном виде, чтобы потом не мучиться со смещением, нужно объявлять их сразу за Pragma AutorunPluginFields, и можно спокойно увеличить их количество: C1-C90.
Если вы хотите еще добавить полей, то лучше добавлять их по 30, т.к. это ограничение тотала на один тип. Но можно еще 10 добавить, тогда в секции HintsCustomField будет уже 4 ключа на *.*, а не три.
На счет кракозябр. Изначально было сделано самым простым способом, когда из буфера, содержащего байты, вытягивается одна строка в кодировке Utf8, а другая в Ansi. Далее строка Utf8 обрабатывается построчно. Если в ней есть символ FFFB, то берется эквивалент из Ansi. Расчет на то, что конец строки (за символом ":") весь в Ansi, но если это условие не соблюдается, то будут другие кракозябры из-за избыточной конвертации.
Болван предложил решение, конечно, крутое, но у меня возникла другая идея, попроще. Функция делает практически то же самое, и если бы не суррогатные пары, была бы совсем простой
 Hidden text | Code: | Func FFFDToAnsi(uStr, aStr)
Static FFFD = Chr(0xFFFD)
Local uLen = StrLen(uStr), aPos = 1, outStr = "", uChar, byte
For i = 1 To uLen
uChar = StrMid(uStr, i, 1)
code = Asc(uChar)
If code < 0x80 Then
byte = 1
ElseIf code < 0x800 Then
byte = 2
ElseIf code < 0xFFFF Then
byte = 3
# High Surrogate (0xD800 - 0xDBFF)
If code >= 0xD800 And code <= 0xDBFF And i < uLen Then
# Low Surrogate (0xDC00 - 0xDFFF)
low = Asc(StrMid(uStr, i+1, 1))
If low >= 0xDC00 And low <= 0xDFFF Then
# Истинный код = ((High - 0xD800) * 0x400) + (Low - 0xDC00) + 0x10000
code = ((code - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000
byte = 4
i += 1
uChar &= Chr(low)
EndIf
EndIf
EndIf
If uChar = FFFD Then
byte = 1
uChar = StrMid(aStr, aPos, 1)
EndIf
#OutputDebugString('char=' & uChar & ' asc=' & code & ' pos=' & aPos & ' byte=' & byte)
aPos += byte
outStr &= uChar
Next
Return outStr
EndFunc |
Вместо
 Hidden text | Code: | For i = 0 to utf8.Count - 1
wrong_pos = StrPos(utf8[i], wrong)
If wrong_pos Then
colon_pos = StrPos(utf8[i], ":")
If wrong_pos > colon_pos Then
colon_ansi = StrPos(ansi[i], ":")
If colon_ansi Then utf8[i] = StrLeft(utf8[i], colon_pos) & StrMid(ansi[i], colon_ansi)
EndIf
EndIf
Next |
теперь вот так, но зато посимвольно
 Hidden text | Code: | For i = 0 to utf8.Count - 1
wrong_pos = StrPos(utf8[i], wrong)
If wrong_pos Then
utf8[i] = FFFDToAnsi(utf8[i], ansi[i])
EndIf
Next |
|
|