LINUX.ORG.RU
ФорумTalks

Список ссылок на сайты в KOI8-R

 ,


0

3

Начал составлять сабж. Пока в списке 31 ссылка. Среди них «Институт Ядерной Физики им.Г.И.Будкера СО РАН», «Информационные научно-образовательные ресурсы ГАГУ», «Нижегородский Университетский Центр Интернет», «ивановский региональный портал», «МЦНМО: МОСКОВСКИЙ ЦЕНТР НЕПРЕРЫВНОГО МАТЕМАТИЧЕСКОГО ОБРАЗОВАНИЯ», «Институт лингвистических исследований», «„За науку!“ :: газета Алтайского государственного университета», «Переславль-Залесский — информационный портал города» и «Специальная астрофизическая обсерватория Российской академии наук». А также ресурсы с документацией по UNIX'ам.

Список здесь: http://saahriktu.org/koi8rsitez.html .

★★★★★

Последнее исправление: saahriktu (всего исправлений: 1)

Ответ на: комментарий от theNamelessOne

Можно и так, но дополнительного указателя всё равно не избежать:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int mycharorder[] = { 64, 33, 34, 56, 37, 38, 54, 36, 55, 42, 43, 44, 45, 46,
        47, 48, 49, 65, 50, 51, 52, 53, 40, 35, 62, 61, 41, 58, 63, 59, 57, 60,
        31, 0, 1, 23, 4, 5, 21, 3, 22, 9, 10, 11, 12, 13, 14, 15, 16, 32, 17,
        18, 19, 20, 7, 2, 29, 28, 8, 25, 30, 26, 24, 27
};

int getcwght(int mc)
{
        if (mc > -65 && mc < 0) {
                return mycharorder[mc + 64];
        } else
                return -1;
}

int main(int argc, char **argv)
{
        if (argc < 3)
                return 1;
        int *cwlist, i, j, k, s, eoas, cci = -1, pccf;
        char *strswp;
        cwlist = (int *)malloc(sizeof(int) * (argc - 1));
        for (;;) {
                cci++;
                eoas = 1;
                for (i = 1; i < argc; i++) {
                        if (cci < (strlen(argv[i]) + 1)) {
                                eoas = 0;
                                break;
                        }
                }
                if (eoas)
                        break;
                for (i = 0; i < argc - 1; i++) {
                        if (cci < (strlen(argv[i + 1]) + 1))
                                cwlist[i] = getcwght(argv[i + 1][cci]);
                        else
                                cwlist[i] = -2;
                }
                for (i = argc - 2; i > 0; i--)
                        for (j = 0; j < i; j++) {
                                if (cwlist[i] == -2 || cwlist[j] == -2)
                                        continue;
                                if (cci > 0) {
                                        pccf = 0;
                                        for (k = 0; k < cci; k++)
                                                if (argv[i + 1][k] !=
                                                    argv[j + 1][k])
                                                        pccf = 1;
                                        if (pccf)
                                                continue;
                                }
                                if (cwlist[i] < cwlist[j]) {
                                        strswp = argv[i + 1];
                                        argv[i + 1] = argv[j + 1];
                                        argv[j + 1] = strswp;
                                        s = cwlist[i];
                                        cwlist[i] = cwlist[j];
                                        cwlist[j] = s;
                                        continue;
                                }
                        }
        }
        for (i = 0; i < argc - 1; i++) {
                puts(argv[i + 1]);
        }
        free(cwlist);
        return 0;
}

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от theNamelessOne

«char *strswp». В предыдущем варианте вместо него был «int *sordr» по которому создавался динамический массив.

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от theNamelessOne

qsort() всё равно требует чтобы в сторонней сравнивающей функции выполнялись все необходимые проверки. Проверки всё равно идут не по строкам, а по отдельным символам (точнее, их «весу» в соответствии требуемого порядка) и подстрокам. А перебирать варианты можно и без qsort().

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от saahriktu

а приём сторонних текстов можно автоматизировать чтобы на лету конвертировалось в KOI8-R.

Как система отличит Koi8-R от другой восьмибитной кодировки?

te111011010
()
Ответ на: комментарий от te111011010

plaintext'ы, как уже писал выше, можно конвертировать в родную кодировку при помощи enca. А другие форматы более сложные и содержат дополнительную инфу. HTML и FB2, например, содержат поля с указанием кодировки (не всегда корректно, но что поделать, тут и у юзера UTF-8 такая же ситуация). pdftotext знает как извлекать текст из PDF файлов в указанную кодировку. Внутри EPUB, DOCX и DJVU (в DJVU очень часто ещё и текстовый слой, да) файлов почти всегда UTF-8. catdoc знает как извлекать текст из DOC файлов в текущую кодировку. xls2csv знает как извлекать текст из XLS файлов в текущую кодировку. catppt знает как извлекать текст из PPT файлов в текущую кодировку. Внутри CHM файлов HTML файлы. ... И т.д. Так что, можно автоматизировать конвертацию всего в plaintext в кодировке локали.

И это не говоря уже о том, что другие кодировки спокойно определяются на глаз (писал выше).

saahriktu ★★★★★
() автор топика
Последнее исправление: saahriktu (всего исправлений: 1)
Ответ на: комментарий от saahriktu

Как только № добавят в KOI8-R, так сразу позовешь. А пока я вижу на своей клавиатуре кнопки которые не будут использоваться для набора в KOI8-R, KOI8-R ненужен. Вообще сейчас смысла в чем-то отличном от юникода нет, ибо байтики экономить не надо.

peregrine ★★★★★
()
Ответ на: комментарий от saahriktu

plaintext'ы, как уже писал выше, можно конвертировать в родную кодировку при помощи enca.

Как оно угадывает, в какой кодировке данный текст?

И вообще ЗАЧЕМ такие сложности? ВСЕ современные языки программирования имеют в стандартной библиотеке средства для работы с широкими символами. Ты считаешь, что юникод создаёт дополнительные трудности. Но неиспользование юникода создаёт гораздо большие трудности.

te111011010
()
Последнее исправление: te111011010 (всего исправлений: 1)
Ответ на: комментарий от te111011010

Как оно угадывает, в какой кодировке данный текст?

Как и онлайн сервисы определения кодировок. Путём анализа наиболее употребительных последовательностей и других особенностей. Рандомный текст оно вряд-ли распарсит, но речь же о русскоязычных текстах в разных кодировках, и тут можно зацепиться за эти самые языковые особенности.

Аыше я уже писал какими преимуществами обладает KOI8-R: Список ссылок на сайты в KOI8-R (комментарий) , Список ссылок на сайты в KOI8-R (комментарий) .

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от te111011010

Так я и жму lzma. Но, это экономит только дисковое пространство. При UTF-8 даже ASCII символы занимают по 4 байта в оперативке каждый. При UTF-8 всё в оперативке превращается в UTF-32. И зачем так издеваться над оперативкой если в шрифте 256 символа?

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от saahriktu

Вопрос лишь в балансе затрат и профитов. Вот я и спрашиваю, в каких твоих задачах конвертация в кои8 оправдана?

dk-
()
Ответ на: комментарий от dk-

Ну так достаточно только один раз сконвертировать после чего удобно хранить и читать при локали KOI8-R. Вот если человеку видна разница между KOI8-R и UTF-8, то тогда он может предпочесть локаль UTF-8 и тогда ему удобнее тексты в UTF-8, да. А если нет разницы по кол-ву символов, но KOI8-R экономнее, то...

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от dk-

Тут уже каждый сам смотрит. Если у человека нет ни времени ни ресурсов что-то там конвертировать, то он и не будет. А если человека это совершенно не напрягает, то он может и видеть смысл. В любом случае, всегда удобнее держать тексты в кодировке локали. И тут уже каждый сам решает что ему удобнее.

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от saahriktu

В любом случае, всегда удобнее держать тексты в кодировке локали. И тут уже каждый сам решает что ему удобнее.

Вот и держат все в utf-8.

te111011010
()
Ответ на: комментарий от saahriktu

Зачем прыгать с кодировки на кодировку? А если потом появится ещё какая-нибудь VUG-256, то все с радостью на неё перепрыгнут и переконвертируют свои коллекции текстовых файлов? Не проще ли выбрать кодировку один раз в жизни?

Вот и выбрали кодировку (семейство кодировок), имеющую наиболее длительный жизненный цикл и наиболее функциональную. Вот потребуется тебе одновременно работать с двумя неанглийскими языками, тебе придётся переходить на юникод. Кто знает, как жизнь распорядится. Может, ты переедешь в неанглоговорящую страну. Или потребуется работать с людьми из такой страны. Или заказчик потребует, чтобы программа отображала знаки валют. Много вариантов есть, когда тебе придётся либо переходить на юникод, либо так извращаться, что все даже мнимые преимущества однобайтных кодировок сойдут на нет.

Экономия системных ресурсов; тексты занимают меньше места на носителях и в оперативке и быстрее обрабатываются;

Какая разница, сколько миллисекунд выполняется твой хеллоуворлд? А более серьёзный софт должен поддерживать многобайтные кодировки. Если тебе не нужен юникод, то другим его пользователям он нужен будет. И ни один адекватный заказчик у тебя не примет такую программу, прибитую гвоздями к однобайтным кодировкам. В крайнем случае, если действительно есть такие случаи, когда многобайтные кодировки обрабатываются медленнее, можно налету конвертировать в однобайтную кодировку, а потом обратно. Я повторяю, если такие случаи и есть, то они редкие. А насчёт хранения текста приведи пример, когда размер его был критичным? Мне вспоминаются только какие-нибудь логи (привет закону Яровой), но они по большей части состоят из латинских букв, которые в utf8 занимают по байту. Также никто не отменял сжатие, которое создаёт меньше проблем, чем весь геморрой с однобайтными кодировками.

Можно переместить указатель на подстроку со смещением N символов просто прописав «strptr + N» без привлечения лишних сущностей в лице ICU (для отфильтровывания диакритики и других модификаторов);

В koi8 никаких модификаторов нет. Так что если ими пользуются, то другого выбора, кроме как юникод, нет.

Можно продолжать юзать <<main (int argc, char **argv)>>

Достаточно один раз переконвертировать. Это гораздо легче, чем угадывать кодировку каждого текстового файла.

strncpy, strncmp, printf,... и другие неюникодные функции;

Просто добавь букву w.

te111011010
()
Ответ на: комментарий от te111011010

Вот и выбрали кодировку

Это уже «прыгать».

более серьёзный софт

Всё зависит от использования этого софта. Если софт просто автоматизирует что-либо и никто в него свои юникодные тексты не загоняет, то разницы нет.

В koi8 никаких модификаторов нет

А в UTF-8 есть. И этим она сложнее.

Просто добавь букву w.

Мультибайтные функции работают с массивами wchar_t. В линуксах wchar_t - 4 байта.

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от saahriktu

Это уже «прыгать».

Лично я никуда не прыгал. С самого начала, когда я стал пользоваться Linux, стандартом де-факто там был utf-8. Многие другие тоже не прыгали. Вряд ли они с 90-х пользуются одной и той же системой, перекидывая её на очередной компьютер при помощи dd.

А большинство популярных дистрибутивов разрабатывают англоязычные люди. Особенно в 90-е и начале нулевых. Им всё равно, ascii или utf-8. Для символов, входящих в ascii это одно и то же.

А в UTF-8 есть. И этим она сложнее.

Тогда было бы логичнее пропагандировать не отказ от юникода, а отказ от модификаторов. Либо вместо твоих костылей по конвертации текста в koi8 с удалением символов, которых там нет, можно вместо этого тупо удалять эти модификаторы. Так ты меньше символов потеряешь.

Всё зависит от использования этого софта. Если софт просто автоматизирует что-либо и никто в него свои юникодные тексты не загоняет, то разницы нет.

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

Мультибайтные функции работают с массивами wchar_t. В линуксах wchar_t - 4 байта.

Тебе не пофигу, с чем они работают? man инкапсуляция.

te111011010
()
Ответ на: комментарий от te111011010

Ну, а когда я начал юзать линукс стандартом была KOI8-R. Как писалось в тех статьях, что до меня доходили. Может многие уже и в то время начинали подбираться к UTF-8, только я ничего об этом не знал.

Тебе не пофигу, с чем они работают?

Так в оперативку помещается в 4 раза меньше текста.

saahriktu ★★★★★
() автор топика
Последнее исправление: saahriktu (всего исправлений: 1)
Ответ на: комментарий от saahriktu

Так в оперативку помещается в 4 раза меньше текста.

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

Ну, а когда я начал юзать линукс стандартом была KOI8-R. Как писалось в тех статьях, что до меня доходили. Может многие уже и в то время начинали подбираться к UTF-8, только я ничего об этом не знал.

И ты ни разу с нуля не переустанавливал систему с тех пор?

te111011010
()
Ответ на: комментарий от te111011010

Кстати да, ТС, как быть с этим:

В том числе и страницы, где часть текста написана на одном языке, а часть на другом.

?
Уж не наркоман ли ты?

dk-
()
Ответ на: комментарий от te111011010

Я не сталкивался с программами, которые работают чисто с текстом и жрут много оперативной памяти

grep, less, скрипты обрабатывающие текст,...

И ты ни разу с нуля не переустанавливал систему с тех пор?

И что? Это повод взять и поменять локаль чтобы перестало работать всё заточенное под прежнюю?

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от dk-

Я уже сотни раз писал, что юзеры KOI8-R не были бы юзерами KOI8-R если бы не были согласны только на 2 языка: русский и английский. Другие языки транслитом в случае чего тоже можно.

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от saahriktu

Да уж... А если французский или китайский, все, слились?

dk-
()
Ответ на: комментарий от dk-

Допустим, не каждый день. Но, у меня текстов немало даже в пожатом виде. Даже в пожатом виде это многие десятки гигов.

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от saahriktu

По первому пункту уже ответили, по второму:

И что? Это повод взять и поменять локаль чтобы перестало работать всё заточенное под прежнюю?

Я не знаю, что у тебя заточено под конкретную кодировку. Лично у меня ничего не заточено. Если ты пишешь код, прибитый гвоздями к конкретной кодировке, значит ты не Ъ-хакер, как ты себя называешь, а быдлокодер.

Мало того, у многих людей нет самописного софта. А те, у кого есть, оценили преимущества юникода перед локальными кодировками.

Кстати, ты, видимо, не сталкивался с проблемой распаковки zip-файлов с русскими буквами на Linux? А использовался бы для zip юникод — такого бы не было.

te111011010
()
Ответ на: комментарий от saahriktu

Я не знаю, что у тебя там за тексты, что они десятки гигов занимают. На серверах (например, крупных интернет-сайтах, поисковиках) да, такое возможно. Но, как правило, там юникод жизненно важен, поскольку одновременно приходится работать с разными языками.

te111011010
()
Ответ на: комментарий от Harald

Не задумывался. Предложений же не ожидается.

dk-
()
Ответ на: комментарий от te111011010

Если ты пишешь код, прибитый гвоздями к конкретной кодировке , значит ты не Ъ-хакер, как ты себя называешь, а быдлокодер.

RLY? А если это, например, вызовы sed'а в регэкспах которого указаны подстроки? Разумеется, кириллицей. В конкретной кодировке. Вот пусть, например, есть скрипт, в котором среди прочего есть

sed -i 's/Москва/столица России/' $1
Как это сделать универсальным образом независящим от кодировок если у скрипта конкретная кодировка?

Конечно, можно переконвертировать скрипт в другую кодировку, но это только один из примеров. И, напоминаю, что в C юникод начинается с wchar_t в то время как для однобайтных кодировок всегда хватало и хватает char/int. Это тоже пример быдлокода? Конечно, всё можно переделывать, но это же надо переделывать... И был бы смысл тратить время. Какая разница если в шрифте всё равно 256 символов?

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от saahriktu

RLY? А если это, например, вызовы sed'а в регэкспах которого указаны подстроки?

Я не представляю, зачем на домашнем компьютере столько sed-скриптов многоразового применения с многолетним жизненным циклом? Да и перекодировать при помощи iconv не так трудно один раз.

int

int — четыре байта на большинстве современных систем. Только не рассказывай, что в школе/институте Клавдия Михайловна, царство ей небесное, учила тебя, что в инте два байта.

te111011010
()
Последнее исправление: te111011010 (всего исправлений: 1)
Ответ на: комментарий от te111011010

Скрипты бывают разные. А я вообще много скриптов пишу. И не только скриптов.

Для большинства задач char выше крыши. int нужен там, где достаточно всего одной переменной - например, в бесконечном цикле чтения stdin до EOF. Потому, что EOF == -1, а на ARM'ах нет знакового char. Там char беззнаковый. В итоге вместо EOF в переменную типа char попадает 255, что эквивалентно символу 'Ъ' в KOI8-R. В итоге софтина входит в бесконечный цикл чтения символа 'Ъ'. А вот если сделать переменную не char, а int, то всё работает везде и всегда.

saahriktu ★★★★★
() автор топика
Последнее исправление: saahriktu (всего исправлений: 1)
Ответ на: комментарий от saahriktu

Ты в меньшинстве. Можешь в отдельной теме устроить опрос, многие ли из лоровцев пишут лично для себя скрипты, прибитые к кодировке, и имеющие жизненный цикл в несколько лет. А также у многих ли при работе с plain text на десктопе сжиралось много оперативной памяти.

te111011010
()
Ответ на: комментарий от saahriktu

Ещё, помимо распаковки zip, могу напомнить старую проблему с крякозябрами в icq-клиентах. Многие неофициальные клиенты некорректно работали с русским языком. Про ситуации, когда надо общаться на нескольких языках, я не говорю. Наверное, ты должен помнить эту эпоху.

А jabber тем временем тогда использовал юникод.

te111011010
()
Последнее исправление: te111011010 (всего исправлений: 1)
Ответ на: комментарий от te111011010

Начало ICQ я не застал, но под самый конец я там посидел. В текстовой консоли с локалью KOI8-R. Через клиент climm. Всё работало прекрасно. Теперь climm давно не обновлялся и с новым ICQ не работает. Зато с ним работает bitlbee. bitlbee вообще мультипротокольная вещь. msn, jabber, oscar, yahoo и twitter в любимом IRC клиенте (у меня это irssi). Даже в консоли с локалью KOI8-R.

saahriktu ★★★★★
() автор топика
Ответ на: комментарий от dk-

Терпеливый, это не то слово... Впрочем Ттт должен быть терпиливым :)

Stil ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.