на картинке длина строки
как заранее автоматически узнать кодировку каждого символа в строке?
ну или длину этого символа
ну или длину этого символа
вот имеем код
call BJDebugMsg("privet - "+I2S(StringLength("privet")))
call BJDebugMsg("pri vet - "+I2S(StringLength("pri vet")))
call BJDebugMsg("привет - "+I2S(StringLength("привет")))
call BJDebugMsg("при вет - "+I2S(StringLength("при вет")))
call BJDebugMsg("приvet - "+I2S(StringLength("приvet")))
call BJDebugMsg("при vet - "+I2S(StringLength("при vet")))
но если мы применим любую самописную строковую функцию, то она перестанет работать
(например черно белая покраска каждой буквы в строке)
т.к. обычно идёт посимвольный перебор и StringLength() / SubString() выдадут разные значения
и если с английским текстом всё просто - мы двигаемся на +1 каждую итерацию
то с русским текстом надо на +2 двигаться, а любой пробел это +1 а не +2
таким образом любая функция для ру текста сломается на первом пробеле
какой принцип работы вообще в таких случаях?
(например черно белая покраска каждой буквы в строке)
т.к. обычно идёт посимвольный перебор и StringLength() / SubString() выдадут разные значения
и если с английским текстом всё просто - мы двигаемся на +1 каждую итерацию
то с русским текстом надо на +2 двигаться, а любой пробел это +1 а не +2
таким образом любая функция для ру текста сломается на первом пробеле
какой принцип работы вообще в таких случаях?
или проще не заморачиваться со строковыми функциями и по возможности крутить болтами весь текст?
как раз по причине того, что вар не умеет выдавать единый номер символа для разных кодировок
как раз по причине того, что вар не умеет выдавать единый номер символа для разных кодировок
мало того, SubString() вообще оборвётся при несостыковке количества символов с кодировкой, см пример:
call BJDebugMsg("п1 - !"+SubString("п",0,1)+"!")
call BJDebugMsg("п2 - !"+SubString("п",0,2)+"!")
--- доп инфо: --- (навеяно этим постом)
nazarpunk: StringLength возвращает количество символов или байтов?call BJDebugMsg("privet - "+I2S(StringLength("privet"))) // en - 1 call BJDebugMsg("привет - "+I2S(StringLength("привет"))) // ru - 2 call BJDebugMsg("priвет - "+I2S(StringLength("priвет"))) call BJDebugMsg("你好 - "+I2S(StringLength("你好"))) // ch - 3 call BJDebugMsg("こんにちは - "+I2S(StringLength("こんにちは"))) // jp - 3 call BJDebugMsg("안녕하세요 - "+I2S(StringLength("안녕하세요"))) // ko - 3 call BJDebugMsg("☁❤♫✉ - "+I2S(StringLength("☁❤♫✉"))) // icons - 3
возвращает количество символов/байтов после перевода из юникода в системный ANSI (тоже самое и с обрезкой)
я про это выше и писал при использовании мультиязыков в одном стринге (знаки препинания - то это англ)
иероглифы и смайлы кста по 3 занимают, англ 1, ру 2
вот например код из карты, когда картоделу приходится проверять локаль из чата и резать разным количеством, чтобы выполнить одну и ту же команду:
во второй -чатстроке сиди считай 1+3+3+3=10 при написании кодаif SubString(s,0,6)=="-count" then call Command__CountMain(s,true) elseif SubString(s,0,10)=="-카운트" then call Command__CountMain(s,false) function Command__CountMain takes string s,boolean Eng returns nothing if Eng==false then set time=S2I(SubString(s,11,13)) else set time=S2I(SubString(s,7,9)) endif
Принятый ответ
решение тут xgm.guru/p/wc3/DecodeSymbols
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Ред. konvan5
Ред. host_pi
Ред. IceFog