lua смена регистров кириллицы

Xomiak09

собственно сабж. Нужно поменять маленькую букву н заглавную, а string.upper, string.lower с кириллицей не работают :(

kokoc88

> os.setlocale('rus_rus.866')
> print(string.upper('тест'
ТЕСТ
>

Xomiak09

не работает :(

kokoc88

не работает
У меня это работает. Очевидно, ты либо не понял идею, либо что-то делаешь не так. Например, ставишь 866 страницу в UTF-8 консоли.

Xomiak09

Сообщение удалил

Xomiak09

а еще варианты есть?

serega1604

хз, у меня в юникодной локали тоже не работает, а вот в koi8-r - все работает отлично :(

Xomiak09

и че делать?

Xomiak09

ну хорошо, как с помощью lua вывести юникод символа?

serega1604

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

Xomiak09

а что непонятно?

serega1604

что такое юникод символа и зачем тебе его получать в lua

kokoc88

и че делать?
Ставить правильную локаль. Все правильно написанные сишные программы работают с русским языком в любой консоли. (По крайней мере в винде это так, и я удивлюсь, если консоли в *х чем-то хуже.)

Xomiak09

что такое юникод символа и зачем тебе е
Хорошо у меня задача есть строка например "строка", в которой все символы - кириллица. Нужно написать скрипт, который на выходе давал, все варианты с верхними и нижними регистрами, т.е. :
слово
Слово
сЛово
слОво
слоВо
словО
СЛово
сЛОво
...и т. д.
в случае строки из n символов должен давать 2^n вариантов.
з.ы. Юникод это если не ошибаюсь UTF-16

kokoc88

как с помощью lua вывести юникод символа?
Очень интересно, что такое юникод символа. Lua написан на char-ах, и поэтому из юникода он совместим только с UTF-8. Напиши программу в файле с этой кодировкой, и работай с ней в UTF-8 консоли. Это под *x, под виндой можно работать в 1251 или 866.

Xomiak09

что значит " работай с ней в UTF-8 консоли " ?

Xomiak09

я под линуксом сижу, к слову.

Xomiak09

черт с ним с lua, как на С/С++ это сделать? (сменить регистр или вывести UTF-16 код символа) ?

kokoc88

я под линуксом сижу, к слову.
Ну надо же, наконец-то появилась информация, которую нужно было дать в первом посте. Ты должен задать подходящую для сишной библиотеки локаль через os.setlocale и сохранить текст lua программы в такой же кодировке. Если ты запускаешь интерпретатор из консоли, то тебе нужно установить такую же локаль в консоли.

Xomiak09

я ничерта не понял, что ты написал. Какие локали еще? :confused: извини за ламерство. Можешь пример привести, плиз! К слову , я проверил :
os.setlocale('rus_rus.866')
os.setlocale ("ru_RU.CP1251")
os.setlocale ("Russian_Russia.1251")
ничего из этого не работает

serega1604

http://lua-users.org/lists/lua-l/2005-05/msg00317.html
судя по этой штуке три года назад народ жаловался на неполную поддержку utf-8 в lua
(я уверен, что говоря про юникод ты подразумевал UTF-8 а не UTF-16)
отсюда вывод - надо пользоваться не юникодной локалью
os.setlocale('rus_rus.866')
os.setlocale ("ru_RU.CP1251")
os.setlocale ("Russian_Russia.1251")
ничего из этого не работает
кроме этих команд нужно чтобы исходная строка (которую ты пытаешься перевести) была в той же кодировке

kokoc88

Какие локали еще?
Почитай мануал к стандартной сишной библиотеке.
Тебе нужно "ru_RU.866" и сохранить файл скрипта в той же самой кодировке (866). Что такое locale, codepage, и так далее можно почитать в википедии.

Xomiak09

locale:
LANG=ru_RU.UTF-8
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=
соответсвенно я должен что сделать? iconvom поменять кодировку файла скрипта?

serega1604

ну вот тебе пример, который у тебя должен заработать
echo тест |iconv -t koi8-r | lua -e "os.setlocale('ru_RU.KOI8-R'); a=io.read; print(string.upper(a" | iconv -f koi8-r

просто поменять кодировку скрипта - мало, надо чтобы в коде эта кодировка правильно указывалась.

Xomiak09


$ iconv -f UTF-8 -t 866 2
#!/usr/bin/lua
os.setlocale('ru_ru.866')
--os.setlocale ("ru_RU.CP1251")
--os.setlocale ("Russian_Russia.1251")
print(string.upper('����'

$ lua 2
рука

ниче не меняет зараза.

serega1604

и ещё - если у тебя будут подаваться на вход какие-либо данные, то тебе их придётся перекодировать из юникода в нужную тебе кодировку.

serega1604

ниче не меняет зараза.
потому что ты не прочитал нормально мануал по iconv
сделай
iconv -f UTF-8  -t cp866 2 > 3
lua 3 | iconv -f cp866 -t UTF-8

Xomiak09

conv -f UTF-8 -t cp866 2 > 3 ./3 | iconv -f cp866 -t UTF-8

#!/usr/bin/lua
os.setlocale('ru_ru.866')
print(string.upper('рука'
$ iconv -f UTF-8 -t cp866 2 > 3
$ lua 3 | iconv -f cp866 -t UTF-8
рука

ппц. :confused:

serega1604

os.setlocale('ru_ru.866')
ты откуда такую строчку придумал?
рекомендую проверить результат этого действия вот так
print(os.setlocale('ru_ru.866'
ну и заодно сравнить с
print(os.setlocale('ru_RU.KOI8-R'
после этого почитать документацию и понять, где ошибка

Xomiak09

и то и другое выдает nil
работает только :
os.setlocale("ru_RU.utf8")
в документации что на lua.org ниче не нарыл.

serega1604

http://www.lua.ru/doc/5.8.html#pdf-os.setlocale
локаль-то у тебя в системе есть та, которую ты пытаешься выставить?
что выдаёт locale -a

Xomiak09

C
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IN
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZW.utf8
POSIX
ru_RU.utf8
ru_UA.utf8

Xomiak09

видимо нужно доваить локаль в систему...

conv3rsje

Если мне не изменяет память, в 90 процентах случаев нет нормального преобразования регистров для уникода.
(Не важно в какой кодировке - utf-8/16/... всего-лишь байтовое представление)
Соответственно тебе не локали надо выставлять (хотя в первом случае это тоже понадобится а либо преобразовать строку в однобайтовую кодировку (koi8-r, iso8859-15, cp1251, cp866) и юзать однобайтовые lower/upper или заботать что-то типа этого
зы
чо-та долго писал :)

serega1604

если дебиан/убунта, то расово верным методом будет sudo dpkg-reconfigure locales

Xomiak09


sudo dpkg-reconfigure locales
Generating locales...
en_AU.UTF-8... up-to-date
en_BW.UTF-8... up-to-date
en_CA.UTF-8... up-to-date
en_DK.UTF-8... up-to-date
en_GB.UTF-8... up-to-date
en_HK.UTF-8... up-to-date
en_IE.UTF-8... up-to-date
en_IN.UTF-8... up-to-date
en_NZ.UTF-8... up-to-date
en_PH.UTF-8... up-to-date
en_SG.UTF-8... up-to-date
en_US.UTF-8... up-to-date
en_ZA.UTF-8... up-to-date
en_ZW.UTF-8... up-to-date
ru_RU.UTF-8... up-to-date
ru_UA.UTF-8... up-to-date
Generation complete.

Зараза, никаких 866 и подавно! :mad: насчет однобайтовых кодировок, это icoinvom сначала в кои8-r а потом обратно в utf-8?

conv3rsje

Вообще он должен спросить какие локали генерить
попробуй dpkg-reconfigure -p low locales
По крайней мере у меня спрашивал всегда :)
Да, гонять туда-сюда иконвом. Можно программно, а не через шелл

serega1604

Да, гонять туда-сюда иконвом. Можно программно, а не через шелл
есть, кстати, вот такая штука
http://luaforge.net/projects/lua-iconv/

vall

и нафига тебе локаль менять?
я бы слово на входе преобразовал в личный нумерованный алфавит и задал пару табличек — заглавные и прописные буквы.
красота этого кода явно не стоит трёх часов поиска истины на форуме =)

conv3rsje

Вообще говоря
Lua 5.1.3  Copyright (C) 1994-2008 Lua.org, PUC-Rio
> require("utf8data")
> require("utf8")
> print(string.utf8upper("ыЫы"
ЫЫЫ

vall

и какого размера этот модулёк? =)

conv3rsje

2к строк :)
http://github.com/Zariel/ouf_grid/tree/master/lib/UTF8
где-то еще видел

vall

фи, он явно весь юникод не покрывает
древние шумеры очень расстроятся если у них это не заработает =)
омг, так и знал чито для ВоВа писали

conv3rsje

Ничо, порасстраиваются и патч отошлют :)
Я кстати не в курсе, у них было разделение на регистры? :)

vall

хз, при первой встрече спрошу обязательно

conv3rsje

омг, так и знал чито для ВоВа писали
омг, ты знаешь что такое oUF!? :shocked:

vall

к сожалению я теперь знаю что такое вов, но плагины к нему я ещё писать не начал =)

Xomiak09

да действительно, с помощью двух табличек {а, б, в, г, ....} { А, Б, В,Г, ...} замена одного символа решается тривиально.
Но вот вопрос:

>s = {}
>s = "ПРЕВЕД"
>print string.len(s)
>print (s[0], s[1], s[2])
>print(string.sub(s, 1,1
12
nil nil nil
nil

Как же мне вывести i-тый символ строки, если кириллица? :confused:

conv3rsje

Иди качай модули по ссылке :)
Там все есть :)

Xomiak09

зашибись, скачал все работает АЕ! спасибо большое!
Оставить комментарий
Имя или ник:
Комментарий: