Няшная / Говнокод #18177 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
  63. 63
  64. 64
  65. 65
  66. 66
  67. 67
  68. 68
  69. 69
  70. 70
void UPStr(char *str)
{
    while (*str)
    {
        switch (*str)
        {
            case 'а': *str = 'А'; break;
            case 'б': *str = 'Б'; break;
            case 'в': *str = 'В'; break;
            case 'г': *str = 'Г'; break;
            case 'д': *str = 'Д'; break;
            case 'е': *str = 'Е'; break;
            case 'ё': *str = 'Ё'; break;
            case 'ж': *str = 'Ж'; break;
            case 'з': *str = 'З'; break;
            case 'и': *str = 'И'; break;
            case 'й': *str = 'Й'; break;
            case 'к': *str = 'К'; break;
            case 'л': *str = 'Л'; break;
            case 'м': *str = 'М'; break;
            case 'н': *str = 'Н'; break;
            case 'о': *str = 'О'; break;
            case 'п': *str = 'П'; break;
            case 'р': *str = 'Р'; break;
            case 'с': *str = 'С'; break;
            case 'т': *str = 'Т'; break;
            case 'у': *str = 'У'; break;
            case 'ф': *str = 'Ф'; break;
            case 'х': *str = 'Х'; break;
            case 'ц': *str = 'Ц'; break;
            case 'ч': *str = 'Ч'; break;
            case 'ш': *str = 'Ш'; break;
            case 'щ': *str = 'Щ'; break;
            case 'ъ': *str = 'Ъ'; break;
            case 'ы': *str = 'Ы'; break;
            case 'ь': *str = 'Ь'; break;
            case 'э': *str = 'Э'; break;
            case 'ю': *str = 'Ю'; break;
            case 'я': *str = 'Я'; break;

            case 'a': *str = 'A'; break;
            case 'b': *str = 'B'; break;
            case 'c': *str = 'C'; break;
            case 'd': *str = 'D'; break;
            case 'e': *str = 'E'; break;
            case 'f': *str = 'F'; break;
            case 'g': *str = 'G'; break;
            case 'h': *str = 'H'; break;
            case 'i': *str = 'I'; break;
            case 'j': *str = 'J'; break;
            case 'k': *str = 'K'; break;
            case 'l': *str = 'L'; break;
            case 'm': *str = 'M'; break;
            case 'n': *str = 'N'; break;
            case 'o': *str = 'O'; break;
            case 'p': *str = 'P'; break;
            case 'q': *str = 'Q'; break;
            case 'r': *str = 'R'; break;
            case 's': *str = 'S'; break;
            case 't': *str = 'T'; break;
            case 'u': *str = 'U'; break;
            case 'v': *str = 'V'; break;
            case 'w': *str = 'W'; break;
            case 'x': *str = 'X'; break;
            case 'y': *str = 'Y'; break;
            case 'z': *str = 'Z'; break;
        }
        ++str;
    }
}

Запостил: vr8h vr8h, (Updated )

Комментарии (55) RSS

    • С toupper беда: по умолчанию она переводит в заглавные только ASCII, т. е. только базовую латиницу. Для перевода букв других алфавитов нужна локализованная версия функции, которая на вход принимает ещё и кодировку.

      Для UTF-8 есть mbctoupper, а для UTF-16/UCS-2 (кто знает точно, для какой из них?) — towupper. Но здесь, как я понимаю, кодировка однобайтная. Значит, либо придётся либо использовать API операционной системы (в Windows уже упомянутую CharUpper, которая в качестве параметра кодировку не принимает, поэтому её результат зависит от локали, установленной у клиента) либо тащить с собой дополнительную библиотеку (iconv или типа того).

      В любом случае даже приведённый код можно было сократить в два раза с помощью toupper.
      Ответить
        • Которую придётся каждые полгода обновлять, если проект использует преобразование часовых поясов из этой библиотеки.

          P.S. Это замечание к данному коду не относится, просто наболело.
          Ответить
          • > Которую придётся каждые полгода обновлять, если проект использует преобразование часовых поясов из этой библиотеки.

            если у тебя нет кастомеров на каких Фиджи, и если ты не грандиозный педант, то обновлять можно и раз в 2-3 года.

            история виндовых апдейтов:

            https://support.microsoft.com/en-us/kb/2981580 (2014)
            https://support.microsoft.com/en-us/kb/2904266 (2013)
            https://support.microsoft.com/en-us/kb/2779562 (2012)
            https://support.microsoft.com/en-us/kb/2633952 (<--- 2011, последний раз когда в Европе что-то менялось.)
            Ответить
            • А Россия — це не Европа?

              P.S. Не хочу участвовать в политических дебатах, но часовые пояса обсудить нужно.
              Ответить
              • Россия и Турция - это единственные страны, достаточно близкие что бы быть кастомерами, где что-то менялось за после *пять* лет.

                я не то что бы сильно слежу за темой - может еще чего и пропустил - просто время от времени в виндовые апдейты поглядываю.

                > но часовые пояса обсудить нужно.

                меняют часто только те страны для которых это больших проблем не создаёт.

                большие страны - таже Россия - часто этого делать не будет потому что слишком большой эффект у изменения. и как правило самые подверженые "временным" проблемам системы - это финансовые, т.к. все повально всё ещё в местном времени ведут учёт переводов и платежей.
                Ответить
                • > часто этого делать не будет

                  В 2011-м году говорили, что реформа будет последней и больше ничего переводить не будем. Прошло три года и снова реформа.
                  Ответить
          • Это же пиздец просто какой то. Не ужто в любимом многими линуксе существуют траблы с выводом в консоль.
            Ответить
          • а если так?
            #include <locale>
            std::locale rus("russia_russia");
            std::locale::global(rus);
            char b = 'б';
            std::toupper(b, rus);
            Ответить
            • К сожалению:
              - в винде и в линухе совершенно разные названия локалей;
              - 'б' не всегда помещается в char;
              - std::toupper() бесполезен для multibyte кодировок.

              Так что без бутылки буста тут не разобраться ;(
              Ответить
              • какие мультибайт кодировки, вы исходный пост читали?

                - для альтернативных ОС мультибайт надо переводить в вайд, т.к. врядли только апперкейсом ограничится
                - std::toupper(std::locale) работает в т.ч. и с вайд
                - перевод utf8<->вайд есть в самом с++11 уже (т.к. слямзили с буста)
                Ответить
                • > вайд
                  Правда, даже с вайдом немцы со своим SS соснут. Ну да хрен с ними, всё равно задача ОПа только для русских.

                  > исходный пост читали
                  Не барское это дело, исходные посты читать.
                  Ответить
                  • Немцы со своим SS в любой кодировке сосут, потому что в нижний регистр оно может преобразовываться как ss или как ß, в зависимости от слова. Тут без словаря вообще не преобразуешь.

                    И наоборот, насчёт того, преобразовывать ß в SS или оставить, как есть, единого мнения нет.

                    Кстати, не все редакции журналов признали реформу 1996 года, в результате которой появилось сочетание SSS и пришлось соснуть ещё раз.
                    Ответить
                    • То есть то, что ß однозначно заменили на ss - неверно? Чорт, вот как так можно ухитриться насрать себе в кашу в конце 20 века, когда все связанные с этим компьютерные проблемы уже видны?
                      Ответить
                      • Где однозначно заменили? В Швейцарии?

                        В сраной гермашке, как и раньше, нужен словарь. Только теперь словарь нужно обновить, потому что ß теперь пишется чуть-чуть реже.
                        Ответить
                        • Кстати, зачем ещё SSS? Я понимаю, можно заменить ß на SS для упрощения, но в каком случае требуется три буквы?
                          Ответить
                          • В слове «масштаб», например, и в других многоосновных. Правда, если верить викисловарю, в Германии именно это слово оставили: https://de.wiktionary.org/wiki/Maßstab. НО ЕСЛИ ПИСАТЬ КАПСОМ, ТО ТРЕБУЮТСЯ ТРИ БУКВЫ S ПОДРЯД. А швейцарцы и без капса пишут с тремя одинаковыми буквами подряд.

                            P.S. В названиях улиц есть. Paßstraße после реформы 1996 называется Passstraße.

                            https://commons.wikimedia.org/wiki/File:RechtschreibreformBeiStrassennamen. jpg
                            Ответить
                          • Нашёл ещё один пример:
                            Schlußstrich → Schlussstrich.
                            «Заключительный штрих» от Schluẞ→Schluss — «заключение» и Strich — «черта».
                            Ответить
                            • Кстати, в "Папиных дочках" в какой-то серии искали то ли слово "длинношеее", то ли ещё какое-то.
                              Чему ещё я удивляюсь...
                              Ответить
                      • > когда все связанные с этим компьютерные проблемы уже видны

                        Когда в ходу была КОИ-7, компьютерные проблемы вызывали даже строчные буквы, ПОЭТОМУ ВСЕ ПИСАЛИ КАПСОМ. И ЭТО НЕ СЧИТАЛОСЬ ЭКСПРЕССИВНО ОКРАШЕННОЙ РЕЧЬЮ. ЗАТО СКОЛЬКО БАЙТ ЭКОНОМИЛОСЬ; ШИФТ ПЕРЕКЛЮЧАЛ С КИРИЛЛИЦЫ НА ЛАТИНИЦУ, А НЕ СО СТРОЧНЫХ НА ЗАГЛАВНЫЕ. КРАСОТА!

                        К чему это я? Компьютерные проблемы — временные. Если в 90-х винчестер на гигабайт был пределом мечтаний, то сейчас у обычного школьника в мобильном телефоне карта памяти больше.

                        *****

                        Средство для розжига: в турецком языке есть буквы İ («и» заглавная с точкой) и ı («и» строчная без точки). Из-за этой мелочи таблица соответствия заглавных строчным не соответствует европейской. Домашнее задание: предложите реформу турецкой орфографии, чтобы устранить компьютерную проблему.
                        Ответить
                        • > предложите реформу турецкой орфографии, чтобы устранить компьютерную проблему.
                          Да выпилить к чертям ненужную букву!
                          Вот у украинцев зачем-то три буквы "и" и две буквы "е", если не ошибаюсь. Зачем они? Выпилить, как в русском выпилили лишние буквы.
                          У нас йэщо остались как минимум буквы тсэ, йэ, йо, йу, йа, которыйэ можно спокойно выпилить. Ну или выпилить э, а йэ оставить. Йэщо мошно выпилить букву, на которуйу начинайэтсьа слово "шопа". Тоше не очэнь нушная буква, всьо равно йэйо мошно спутать с буквой "ш", а так искусствьэнная гранитса будьэт размыта.
                          Ответить
                        • Хе-хе. Работал я, в общем, в госструктуре одной, обрабатывали мы правовые акты. И вот таки i латинское и i белорусское (палюсь) - две разные юникод-сущности. А в исходных текстах было то так, то сяк. Ну, нормировали к одной какой-то букве при индексации для поиска.. а вот если еще и латинские термины или формулы какие в документах - наверное индексатор наиндексирует хуйню.
                          Ответить
  • У меня сразу встал вопрос про кодировку. А у тебя уже чешется ответ?
    Ответить
    • Любая однобайтовая, в которой есть кириллица. Лишь бы совпадала с кодировкой исходника.
      Ответить
  • Зато кроссплатформенно, и даже для говнокодировок будет работать.
    Ответить

Добавить комментарий

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8