Replies (64)

  • @vt, Вендакапец уже скоро
  • @vt, Фу, UTF-8 в консоли.
  • @vt, шел 2017-й, MS наконец-то осилили утф
  • @zoonman, Всегда было UTF-16, это красноглазые дебилы пихают туда UTF-8.
  • @zoonman, Тебе в прошлый тред juick.com
  • @vt, а setlocale()-то починят?
  • @vt, ну вот теперь, может, не понадобится одевать трусы через голову.
  • @max630, А с strlen то что делать?
  • @vt, Ты не хочешь ли сказать что в utf-16 strlen() имеет какой-то смысл?
  • @max630, ну то есть кроме "сколько памяти выделить"
  • @vt, В общем, ответ такой что 99% кода со строками вообще ничего делать не надо, кроме как копировать.

    А если правильно упарываться по уникоду то там дна нет.
  • @max630, Ещё раз для дебилов: есть WriteConsoleW.
  • @max630, Ещё раз для дебилов: у Windows есть API для работы с консолью, используй его, а не свои трусы.
  • @mabu, Вот дебилам можешь советовать что угодно, а людей бодет полезной возможность использовать переносимый апи, а не переписывать полпроекта под одну из платформ, иногда довольно маргинальную.
  • @max630, Так как в этом "переносимом апи" узнать длину строки? Очевидно это брехня, и никакого переносимого апи нет. А в прошлом треде выяснили, что "стандартом" является именно wide char-строки, а не этот линукс-костыль
  • @max630, Ты хотел сказать — говнокод, написанный под UTF-8-костыль, ничего, кроме копирования строк, не делает, это верно, поэтому внутри каждого красноглазого проекта заново переизобретают тип string.
  • @max630, Ещё раз говорю: для вывода на консоль есть функция WriteConsoleW.
  • @vt, А что такое "длина строки"?
  • @max630, Вот когда у тебя будет ответ на этот вопрос средствами "апи", тогда и приходи, а пока твой костыль показывает погоду на марсе
  • @vt, ты мне так и не задал вопрос, на который надо отвечать. что блять за длина строки? место которое надо выделять? число пикселей которая она займёт в гуе? число закорючек в моноширинном шрифте? на какой из этих вопросов утф-16 отвечает лучше чем утф-8? правильно, ни на какой, роме первого, если нам зачем-то надо хранить и передавать именно утф-16
  • @max630, Ни в утф-8, ну и утф-16 не надо ничего хранить. Подсказываю, strlen(“😀”) равен 1
  • @vt, strlen(“😀”) равен 1
    Это где так? В js — нет, в C# — нет. Везде 2. В хаскеле разве что 1. Но и там strlen("е́") равно 2.
  • @max630, где так?В 2017 году, на скриншоте. Никакой магии, оно пользует ICU.
    В хаскеле ... равно 2Ну и зачем это бажное говно нужно?
  • @vt, алсо
  • @max630, The length property of a String object indicates the length of a string, in UTF-16 code units.developer.mozilla.org

    '⛳'.length === 1
    "💩".length === 2
    blog.jonnew.com
    news.ycombinator.com
  • @killy, ну так это неправильно, потому что в js тоже нет нормального стринга
  • @vt, Ну можно затащить это в JS: github.com
    Лучше бы конечно расширить поддерживаемый диапазон, но это, наверное, поломает много чего.

    Имхо, в Юникоде нет нормального стринга, а не в JS.
  • @vt, Ну если всё равно звать libicu, почему нельзя ей отдавать строки в utf-8?
  • @killy, В юникоде есть все правила для того, чтоб реализовать нормальный стринг, я его показал. А суть моей постоянной дискуссии с utf8-дебилами в том, что они пытаются рассказать, будто utf8 everywhere автоматически решит все проблемы, на сайте utf8everywhere.org в частности очень давно мечтали о том, что микрософт реализует то, что в /0. Только это не решит никаких проблем, это просто позволит запускать красноглазые костыли на винде с меньшими трудностями, а strlen("е́") в js и хаскеле так и останется 2
  • @vt, Вот Хаскель.
  • @max630, Да я не против, есть нормальная либа, умеющая работать со строками — замечательно. Только ведь красноглазый софт не пользует готовые либы, тот же icu, а внутри себя изобретают велосипед с багами, см. хаскель.
  • @killy, "éé"
  • @vt, это ты продукт microsoft research сейчас красноглазым обозвал?
  • @max630, я и Windows10 insider preview build 17035 могу таким назвать, хуйней занимаются, вместо того чтоб доделать апи
  • @killy, Я жду скриншот вывода
    "éé".count
    из той хрени на маке.
  • @killy, 2 там, можешь ее на линукс поставить — swift.org — и даже на виндовс есть сборочки неофициальные
  • @max630, .net
  • @vt, Даже BASIC умеет в юникод в консоли, не то что это красноглазое говно.
  • @max630, Swift:
    Every instance of Swift’s Character type represents a single extended grapheme cluster. An extended grapheme cluster is a sequence of one or more Unicode scalars that (when combined) produce a single human-readable character.developer.apple.com
  • @max630, Haskell:
    The character type Char is an enumeration whose values represent Unicode (or equivalently ISO/IEC 10646) characters (see unicode.org for details).downloads.haskell.org

    Если нужно grapheme clusters, то их тоже есть, в hackage.haskell.org
  • @killy, просто подключи icu в своём любимом языке.
  • @killy, Да, в прошлых беседах о хаскеле мне рассказывали что там есть десять разных стрингов
  • @vt, А ты слушай больше, что тебе рассказывают.
  • @max630, подключил:
    Prelude Data.Text.ICU>Дальше что писать?
  • @vt, Я обнаружил, что для того, чтобы text-icu на винде поставить, надо icu скомпилировать, и отложил это дело, поэтому пока не скажу.
  • @killy, Хех.
    Итератор в js ходил бы по символам совсем правильно, если бы знал про combining marks.
    exploringjs.com
  • @killy, Почти...
  • @killy, Как-то так: gist.github.com
    1. если просто нужно измерить длину
    2. методы поверх Text
    3. напрашивается свой тип данных вместо Text и String, копирующий подход Swift.

    ЗЫ. ghc.haskell.org
    — кажется, это не проблемы с Windows — это проблемы с IO в принципе.
  • @killy, В общем, если подключить с помощью такой-то матери стороннюю либу, то в хаскеле можно руками написать нормальный стринг, но пока стринга там нет
  • @killy, Напутал с терминологией. Вместо Grapheme надо было какой-нибудь Symbol использовать.
  • @max630, Go: play.golang.org
    Число байт по умолчанию. Либо руны, которые combining characters считают раздельно (как Хаскель или итератор в js).

    Наткнулся на пример нормализации, но не знаю, как нужную либу загрузить в playground.
    Вместо этого посмотрел, как нормализацию в Хаскеле сделать: gist.github.com
  • @vt, там длина как-то через жопу. У меня есть в истории ghci на десктопе, могу скопипастить потом
  • @killy, а эро гарантировано после normalize NF(K)C число Char-ов будет именно длина в смысле libicu?
  • @vt, как я уже сказал, это нужно не всегда. Вот у меня есть своя ребейзилка, там не нужно не то что icu, а вообще уникод как таковой, только возможность взять в одном месте и скопировать в другое место.

    А для задачи которая требует уникода можно и явно icu позвать
  • @max630, Prelude Data.Text Data.Text.ICU> Prelude.length $ breaks (breakCharacter Root) $ pack "é"
    1
  • @max630, Не знаю про libicu.
    Не все combining marks можно нормализовать в один Char, поэтому результат будет отличаться от разбиения по видимым символам на необычных случаях вроде e⃣ (которые и так не везде нормально рисуются).
  • @max630, Сами по себе, NF(K)C и NF(K)D во всех имплементациях должны соответствовать своему определению в стандарте Юникода.
  • @vt, "👩‍❤️‍💋‍👩".count
  • @killy, у меня в jolla это 4 картинки, а на десктопном фаерфоксе в дебиане 1
  • @vt, Ни одна веб-песочница не может отобразить правильно. Сабмитят они, значит, тоже неправильно.
  • @killy, Консольный repl тоже отображает неправильно, но считает правильно