на картинке длина строки
как заранее автоматически узнать кодировку каждого символа в строке?
ну или длину этого символа
вот имеем код
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
таким образом любая функция для ру текста сломается на первом пробеле
какой принцип работы вообще в таких случаях?
или проще не заморачиваться со строковыми функциями и по возможности крутить болтами весь текст?
как раз по причине того, что вар не умеет выдавать единый номер символа для разных кодировок

мало того, 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
`
ОЖИДАНИЕ РЕКЛАМЫ...
Ответы (3)
25
host_pi, хорош, расскажи хоть через какую фишку решил)
25
host_pi, у меня предположение - проходится по строке циклом и брать подстроку из 1 символа. Если подстрока оказывается пустой и при этом еще не конец строки, значит дальше идет символ занимающий 2 символа как минимум, или 3. Далее проверка аналогичная, берем подстроку из 2 символов, если пусто то длина = 3 ибо других вариантов быть не может. Смещаем индекс на 3 и снова чекаем подстроку из 1 символа. Ну и так ты можешь насчитать кол-во "видимых" символов.
14
расскажи хоть через какую фишку решил)
konvan5, чуть позже релиз готовится, это нужно было для другого кода, их оба надо релизить
19
Помнится, мне тоже понадобилось пройтись по символам в строке для того, чтобы проверить её на присутствие запрещенных символов или превышение длины, при этом допуская использование русских букв. В итоге я нашел эту библиотеку.
38
Мультибайтовый модуль строк - это сложная отдельная наука. Не советую юзать сомнительные нерабочие библиотеки, а использовать lua utf-8 www.lua.org/manual/5.3/manual.html#6.5
Чтобы оставить комментарий, пожалуйста, войдите на сайт.