LINUX.ORG.RU

Первый рабочий cgi-скрипт на C++. Ваши мнения.

 , , ,


0

2

(стук в дверь)
- Войдите.
- Здавствуйте!
- Жалуйтесь.
- Доктор, похоже у меня наблюдается хроническая необходимость твоего мнения.
- Излагайте...

Итак, представляю вашему вниманию ещё одну полезную ненужность. Это cgi-скрипт на C++ для разгадывания кроссвордов. GPL v2.

Поддерживаемые функции:
- Отгадывание кроссворда;
- Проверка правильности отгадывания кроссворда;

Для не Ъ: рабочий вариант на FreeBSD-сервере проверял на своём Sony Ericsson K700i, а для Ъ: исходный код версия 1.0.0.
Сам нашёл вот такой странный момент(кстати, что у меня с подсветкой?):

wstring TCrossword::urlDecode(string &sWord)
{
    //На входе обычная string-строка в url-кодированном виде
    string sDecodedWord;
    wstring wsDecodedWord;
    wchar_t wcDecodedWord[UCHAR_MAX + 1];
    char cData;
    const int ucPercent = 37;//Символ %(процент)
    int iData;
    unsigned char i;

    for (i = 0; i < sWord.length(); i++)
    {
        if (int (sWord[i]) == ucPercent)
        {
            //Получить 2-а символа после %
            //"%x" - преобразовать из 16-ричной формы в 10-тичную
            sscanf (sWord.substr(i + 1, 2).c_str(), "%x", &iData);
            //Скопировать полученный wide-код в char-переменную
            cData = static_cast<char>(iData);
            sDecodedWord += cData;
            i += 2;
        }
        else
        {
            sDecodedWord += sWord[i];
        }
    }

    //Многобайтовый string(unicode-символ в 2-ух символах char) преобразовать в нормальную unicode-строку "wstring"
    mbstowcs(wcDecodedWord, sDecodedWord.c_str(), strlen(sDecodedWord.c_str()));
    wsDecodedWord = wcDecodedWord;

    return wsDecodedWord;
}
    char cData;
    int iData;
    cData = static_cast<char>(iData);
Это как? 4 байта преобразуются в 1(!), притом, что там unicode символы, начиная с ~1040, что уже 2-а байта. Этот код опасен? Его я нашёл в сети и изменил под свою задачу.
Дальше ваши замечания.
Благодарю!
P.S. А можно мне четвёртый тег?

★★☆

Дык оно ж для ASCII символов по кодам совпадает (т.е. символы с ASCII кодами от 0 до 127 имеют те же коды в UTF-xx).

Pavval ★★★★★
()

Там два байта, представляющих шестнадцатиричное число %00 - %FF записываются в один 8-битный байт.

mky ★★★★★
()

В URL-ах текст кодируется с помощью так называемого «Percent-encoding». Тут как раз «парсится» один char (процентно-кодированный).

Если планируется передавать в урл что-то типа ASCII, такое будет нормально работать. С UTF-8 в урле (с той же кириллицей, напимер) должно работать некорректно. В википедии же есть про это: http://ru.wikipedia.org/wiki/URL

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

С UTF-8 в урле (с той же кириллицей, напимер) должно работать некорректно

А, простите, недосмотрел. Там же дальше mbstowcs. Да, наверное должно нормально работать.

Но выглядит адово, да

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

Это первый скрипт. Второй будет с AJAX ;)

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

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

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

Я разобрался, там всё путём.

        if (int (sWord[i]) == ucPercent)
        {
            //Получить 2-а символа после %
            //"%x" - преобразовать из 16-ричной формы в 10-тичную
            sscanf (sWord.substr(i + 1, 2).c_str(), "%x", &iData);
            //Скопировать полученный wide-код в char-переменную
            cData = static_cast<char>(iData);
            sDecodedWord += cData;
            i += 2;
        }
Здесь же не wide, а только половина, а значит 1 байт :)
Сейчас исправлю комментарий и перезалью на SourceForge.net

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

wchar_t/wstring - это тупиковый путь развития и windows way. есть например ICU, который работает с char/string в UTF-8 вполне себе нормально.

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от xwicked

какие именно проблемы? как я писал уже выше, смотри в сторону ICU

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

Под никсы же делаю. там wchar_t 4 байта!
Выбрал русский язык ввёл «бетономешалка» на китайском-традиционном «混凝土攪拌機». Ошибка была, пока не оставил только 3 иероглифа. Потом выдало вот это «混凝土&TEXTQUES», так сколькими байтами кодируется китайский?
Русский умножается на 6 - 6 букв, превращаются в 36. Если один иероглиф кодируется всеми 4-мя, то тогда понятно. 3 * 4 = 12, которые вернуло, тогда нужно умножать не на 6, а подсчитать для иероглифоф - и эта функция останется без изменения, то бишь всё интернационально, вроде бы.
ICU не нагуглил - дай ссылку, пожалуйста.

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

Оставь эту библиотеку китайцам. А пока они и на английском смогут погадать кроссворды. Он у них второй национальный ;)
Не понял смысл твоего поста вообще... Там генератора нет, если только на вырост, то это будет ещё не скоро.

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

что? какого ещё генератора? ты о чем? Я про то, что использовать wchar_t - это костыльное решение, а работать с юникодом можно с использованием этой библиотеки. есть хороший пример: boost::regex. Там есть два варианта использования с юникодом: wchar/wstring (для извращенцев) и с бэкендом в виде libicu.

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

Ну что, как я и говорил. Слово «дом» в китайском-традиционном «房子» занимает 6 байт. Один символ(房) получил такой ответ «%E6%88%BF&TE» - 3 байта. Так что, всё путём! Никакие пляски с лишними библиотеками не нужны ;)

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

wchar_t/wstring - это тупиковый путь развития и windows way.

Какое отношение религия имеет к реализациям STL? :) Тем более что под виндой размер wchar_t в два раза меньше.

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

Насколько я понимаю, в unicode нет деления на упрощённые и традиционные, там китайские, японские и корейские иероглифы объединены, отдельно вынесены редко используемые. Редко используемые иероглифы в utf-8 будут четырёхбайтовыми, а остальные трёхбайтовыми последовательностями.

Но зачем вам это не понятно. Если нужно определить сколько байт в utf-8 дают одим символ, то просто анализируйте старшие биты, там ведь всё просто (110xxxxx — 2 байта, 1110xxxx — 3 байта, 11110xxx — 4 байта).

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

DELIRIUM

wchar_t/wstring - это тупиковый путь развития и windows way. есть например ICU, который работает с char/string в UTF-8 вполне себе нормально.

Это мой первый cgi-скрипт. Я написал код и тут же забыл, что и как делается. Потом начал комментировать код и неправильно вспомнил

            //Скопировать полученный wide-код в char-переменную
            cData = static_cast<char>(iData);
Оставил в коде неправильный комментарий. Потом решил переспросить, правильно ли я сделал. А «DELIRIUM» неправильно понял мой вопрос. Будучи теоретиком, наверное, начал «красноречиво» советовать мне какую-то библиотеку. А у меня всё работало. Он по ссылке не прошёл. Вот я и решил углубиться в данный вопрос и мне нужно было найти количество байт не залазия в код. Я выбрал английский язык - вписал иероглиф и получил его в url-кодированном виде. Так что, эта информация пойдёт для будущего расширения возможностей по поддержке кроссвордов и на других языках, кроме английского и русского. Вот так :) .

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