XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Академия: форум для вопросов> Jass
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Ответ
 
bugmaker
invulnerable
offline
Опыт: 2,282
Активность:
проблемма с русскими символами
Вобщем сделал небольшой скрипт для моей системы:

Код:
function separate takes string t returns string

local integer l 
local integer m = S2I( get_cfg ("MaxSymb") )
local integer ml = S2I( get_cfg ("MaxLine") )
local integer z = 0
local integer i = 0
local integer x = -1
local integer n = 0
local string sep = get_cfg ("|n")
local string text = ""
local string array str

set i = 1
set l = StringLength(t)
loop
exitwhen i > l + ml
set str[i] = ""
set i = i + 1
endloop

set i = 1
set l = StringLength(t)
loop
exitwhen i > l + ml
set x = x + 1
if (x > m) then
set z = z + 1
set x = 1
if (z >= (ml)) then
else
set str[z] = SubStringBJ(t, (i-m)-1 , i-2)
set text = text + str[z] + sep
set n = n + 1
endif
endif
set i = i + 1
endloop

if (n < ml) then
set i = 1
loop
exitwhen i > (ml - (n+1))
set text = text + sep
set i = i + 1
endloop
endif

return text
endfunction


Обазначеная:
думаю мне не надо объяснять как прописывать функции get_cfg ("MaxLine") и get_cfg ("MaxSymb") (это строковые значения в кеше)

Собственно вопрос:
если прогнать там текст(qwertyuiopasdfghjklzxcvbnm), в котором тока латинские символы, если "MaxLine" = 15, "MaxSymb" = 5, то получим "qwert|nyuiop|nasdfg|nhjklz|nxcvbn|nm|n|n|n|n|n|n|n|n|n|n" (ну примерно так), а если текст, содержащий русские символы (с темиже параметрами) (йцукенгшщзхъфывапролджэячсмитььб), то получим "йцуке|nнгшщзnхъфыв|nапролnджэяч|nсмитьnьб|n|n|n|n|n|n|n|n|n" (примерно так)т.е через 1 раз сюедает |, а n оставляет.
Вобщем не пойму че за хз такая. Если знаете как мона сделать так чтоб все работало, то подскажите плиз, или альтернативу кую нить.
заранее сенкс.
Старый 25.12.2005, 19:43
zibada

offline
Опыт: отключен
возможно, это связано с тем, что русские строки в некоторых местах хранятся в UTF-8, т.е. один символ может занимать несколько байт, и при разрезании такой строки на отдельные байты можно разрезать "не там", и полезут глюки с пропаданием символов итп..
строка русская у тебя где задается? попробуй напрямую в скрипте (не в триггерах или где-то еще) ее задать..
также попробуй границу разрезания поставить четную, а не 5, хотя при наличии смешанных строк с русскими и не-русскими символами (пробелами например) проблемы все равно останутся..
з.ы. все вышенаписанное есть неподтвержденные догадки.
Старый 25.12.2005, 20:02
NETRAT

offline
Опыт: 83,712
Активность:
Да, видел уже тексты по этому поводу - проблема с русскими символами.
Цитата:
В Варкрафте используется UTF-8, а в нем все русские символы действительно берут по 2 байта.
НО! Это не касается точек, запятых, чисел и вообще "общих" символов для всех языков. Они берут по 1 байту.

То есть при подсчете приходится учитывать эту фичу
Старый 25.12.2005, 20:15
bugmaker
invulnerable
offline
Опыт: 2,282
Активность:
хреново...
Старый 25.12.2005, 20:17
NETRAT

offline
Опыт: 83,712
Активность:
То есть глюки будут наблюдаться с функциями StrLen / StrSubstr и иже с ними. Выход - переделать их на свой лад - то есть чтобы они принимали русские буквы как 2 байта
Старый 25.12.2005, 20:17
bugmaker
invulnerable
offline
Опыт: 2,282
Активность:
ладно спасибо чуваки, пойду в оффлайн родимый и перепишу...
Старый 25.12.2005, 20:29
remal
нечто
offline
Опыт: 2,087
Активность:
у меня строки с русскими символами работали на ура и в скриптах и в чате(при обработки вводимых данных с "консоли" в варе).
Старый 30.12.2005, 15:02
bugmaker
invulnerable
offline
Опыт: 2,282
Активность:
да кста савсэм забыл про ту наработку. короче воть попробовал написать скрипт на определение русских символов. но счето неработает, я его написал за <15 мин. и уверен что сделал идиотскую ошибку которую я немогу найти. А вообще ее как то можно подругому сфорганитъ?

да вотъ константные функции
Код:
function set_cfg takes string key, string val returns nothing
   call StoreString(udg_cache, "Sconfig", key, val)
endfunction

function get_cfg takes string key returns string
   return GetStoredString(udg_cache, "Sconfig", key)
endfunction

function set_SymbList takes string key, string val returns nothing
   call StoreString(udg_cache, "SymbolsList", key, val)
   call StoreInteger(udg_cache, "SymbolsNum", key, StringLength(val))
endfunction

function get_SymbList takes string key returns string
   return GetStoredString(udg_cache, "SymbolsList", key)
endfunction

function get_SymbNum takes string key returns integer
   return GetStoredInteger(udg_cache, "SymbolsList", key)
endfunction


вотъ код который нада впихнуть в триггер, инициализирующийся с мапой
Код:
call set_SymbList("symbols_rus", "йцукенгшщзхъфывапролджэячсмитьбю")
    call set_SymbList("symbols_en", "qwertyuiopasdfghjklzxcvbnm")


а вотъ собсно фанкшын
Код:
function CompareChars takes string char, string case returns integer
local integer i = 1
local integer l = get_SymbNum("symbols_" + case)
local string SmbLst = get_SymbList("symbols_" + case)
local string TmpStr = ""
local boolean flag
loop
exitwhen i > l
set TmpStr = SubStringBJ(SmbLst, i, i)
if (char == TmpStr) then
return 1
endif
set i = i + 1
endloop
return 0
endfunction


ну вот короче (сразу скажите если можно было обойтись без написания алф^авита)

bugmaker добавил:
скажите если я че пропустил, просто скрипт я выдеряю из моей карты, могу не заметить нехватки

Отредактировано bugmaker, 14.01.2006 в 04:50.
Старый 14.01.2006, 04:56
Ответ

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 12:06.