AkulaBig
|
Posted: Sat Oct 10, 2026 22:50 Post subject: |
|
|
| Orion9 wrote: | | Всё, цугундер. |
Ну если и вы исчезнете, теме каюк придет Я все понимаю, жизнь есть жизнь, но все-же хоть иногда появляйтесь.
Я вот наконец-то смог переписать вашу функцию перекодировки в более традиционный вид. Теперь все работает как часики. Хотелось бы чтобы вы посмотрели, нормально ли все?
 Hidden text
| Code: |
Func FixFFFD(String)
Static a = List(), u = List()
Local nSize = StrLen(String)
Local buf = Buffer(nSize)
buf.Zero()
buf.SetStr(String, 0, nSize, "ANSI")
utf8 = buf.GetStr(0, nSize, "CP:65001")
Free(buf)
a.Count = 0
u.Count = 0
a.Text = String
u.Text = utf8
Local aStr = a.Text, uStr = u.Text
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
|
Теперь буду разбираться, как вы подключили код от сансея к ET.
Разобрался. Достаточно было прописать Return FixCPMI(outStr) и все заработало.
Хотелось бы понять, почему в MI не получается перекодировать вот эти крякозябры?
Ведь в ET все правильно отображается:
 |
|