Сбылась мечта идиотов, Микрософт прогнулся - https://twitter.com/matarillo/status/931...
2017-11-16 22:46:32

Участники:
@killy - 20, @vt - 18, @max630 - 18, @mabu - 6, @1lya - 1, @zoonman - 1

@1lya
Вендакапец уже скоро
#2889731/1 2017-11-16 22:47:25
@mabu
Фу, UTF-8 в консоли.
#2889731/2 2017-11-16 23:12:35
@zoonman
шел 2017-й, MS наконец-то осилили утф
#2889731/3 2017-11-16 23:54:00
@mabu
Всегда было UTF-16, это красноглазые дебилы пихают туда UTF-8.
#2889731/4 → /3 2017-11-17 00:29:23
@vt
Тебе в прошлый тред http://juick.com/vt/2888430
#2889731/5 → /3 2017-11-17 04:56:58
@max630
а setlocale()-то починят?
#2889731/6 2017-11-17 07:20:19
@max630
ну вот теперь, может, не понадобится одевать трусы через голову.
#2889731/7 → /5 2017-11-17 07:22:10
@vt
А с strlen то что делать?
#2889731/8 → /7 2017-11-17 07:24:55
@max630
Ты не хочешь ли сказать что в utf-16 strlen() имеет какой-то смысл?
#2889731/9 → /8 2017-11-17 07:29:19
@max630
ну то есть кроме "сколько памяти выделить"
#2889731/10 → /9 2017-11-17 07:30:31
@max630
В общем, ответ такой что 99% кода со строками вообще ничего делать не надо, кроме как копировать. А если правильно упарываться по уникоду то там дна нет.
#2889731/11 → /8 2017-11-17 07:32:54
@mabu
Ещё раз для дебилов: есть WriteConsoleW.
#2889731/12 → /6 2017-11-17 13:10:59
@max630
/7
#2889731/13 → /12 2017-11-17 14:01:53
@mabu
Ещё раз для дебилов: у Windows есть API для работы с консолью, используй его, а не свои трусы.
#2889731/14 → /13 2017-11-17 15:01:04
@max630
Вот дебилам можешь советовать что угодно, а людей бодет полезной возможность использовать переносимый апи, а не переписывать полпроекта под одну из платформ, иногда довольно маргинальную.
#2889731/15 → /14 2017-11-17 17:05:34
@vt
Так как в этом "переносимом апи" узнать длину строки? Очевидно это брехня, и никакого переносимого апи нет. А в прошлом треде выяснили, что "стандартом" является именно wide char-строки, а не этот линукс-костыль
#2889731/16 → /15 2017-11-17 17:09:02
@vt
Ты хотел сказать - говнокод, написанный под UTF-8-костыль, ничего, кроме копирования строк, не делает, это верно, поэтому внутри каждого красноглазого проекта заново переизобретают тип string.
#2889731/17 → /11 2017-11-17 17:11:28
@mabu
Ещё раз говорю: для вывода на консоль есть функция WriteConsoleW.
#2889731/18 → /15 2017-11-17 17:16:51
@max630
А что такое "длина строки"?
#2889731/19 → /16 2017-11-17 17:49:49
@vt
Вот когда у тебя будет ответ на этот вопрос средствами "апи", тогда и приходи, а пока твой костыль показывает погоду на марсе
#2889731/20 → /19 2017-11-17 17:51:55
@max630
ты мне так и не задал вопрос, на который надо отвечать. что блять за длина строки? место которое надо выделять? число пикселей которая она займёт в гуе? число закорючек в моноширинном шрифте? на какой из этих вопросов утф-16 отвечает лучше чем утф-8? правильно, ни на какой, роме первого, если нам зачем-то надо хранить и передавать именно утф-16
#2889731/21 → /20 2017-11-17 17:57:36
@vt
Ни в утф-8, ну и утф-16 не надо ничего хранить. Подсказываю, strlen(“😀”) равен 1
#2889731/22 → /21 2017-11-17 18:17:02
@max630
> strlen(“😀”) равен 1 Это где так? В js - нет, в C# - нет. Везде 2. В хаскеле разве что 1. Но и там strlen("е́") равно 2.
#2889731/23 → /22 2017-11-17 20:28:58
@vt
> где так? В 2017 году, на скриншоте. Никакой магии, оно пользует ICU. > В хаскеле ... равно 2 Ну и зачем это бажное говно нужно?
#2889731/24 → /23 2017-11-17 20:36:10
@vt
алсо
#2889731/25 → /24 2017-11-17 20:40:04
@killy

#2889731/26 → /23 2017-11-17 20:49:37
@killy
> The length property of a String object indicates the length of a string, in UTF-16 code units. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/length '⛳'.length === 1 "💩".length === 2 http://blog.jonnew.com/posts/poo-dot-length-equals-two https://news.ycombinator.com/item?id=13830177
#2889731/27 → /23 2017-11-17 21:16:30
@vt
ну так это неправильно, потому что в js тоже нет нормального стринга
#2889731/28 → /27 2017-11-17 21:17:27
@killy
Ну можно затащить это в JS: https://github.com/orling/grapheme-splitter Лучше бы конечно расширить поддерживаемый диапазон, но это, наверное, поломает много чего. Имхо, в Юникоде нет нормального стринга, а не в JS.
#2889731/29 → /28 2017-11-17 21:19:45
@max630
Ну если всё равно звать libicu, почему нельзя ей отдавать строки в utf-8?
#2889731/30 → /24 2017-11-17 21:23:29
@vt
В юникоде есть все правила для того, чтоб реализовать нормальный стринг, я его показал. А суть моей постоянной дискуссии с utf8-дебилами в том, что они пытаются рассказать, будто utf8 everywhere автоматически решит все проблемы, на сайте utf8everywhere.org в частности очень давно мечтали о том, что микрософт реализует то, что в /0. Только это не решит никаких проблем, это просто позволит запускать красноглазые костыли на винде с меньшими трудностями, а strlen("е́") в js и хаскеле так и останется 2
#2889731/31 → /29 2017-11-17 21:24:54
@killy
Вот Хаскель.
#2889731/32 → /31 2017-11-17 21:28:58
@vt
Да я не против, есть нормальная либа, умеющая работать со строками - замечательно. Только ведь красноглазый софт не пользует готовые либы, тот же icu, а внутри себя изобретают велосипед с багами, см. хаскель.
#2889731/33 → /30 2017-11-17 21:30:04
@killy
"éé"
#2889731/34 → /32 2017-11-17 21:31:08
@max630
это ты продукт microsoft research сейчас красноглазым обозвал?
#2889731/35 → /33 2017-11-17 21:31:11
@vt
я и Windows10 insider preview build 17035 могу таким назвать, хуйней занимаются, вместо того чтоб доделать апи
#2889731/36 → /35 2017-11-17 21:33:07
@killy
Я жду скриншот вывода "éé".count из той хрени на маке.
#2889731/37 → /34 2017-11-17 21:39:06
@vt
2 там, можешь ее на линукс поставить - https://swift.org/download/ - и даже на виндовс есть сборочки неофициальные
#2889731/38 → /37 2017-11-17 21:41:01
@killy
.net
#2889731/39 → /23 2017-11-17 22:17:50
@mabu
Даже BASIC умеет в юникод в консоли, не то что это красноглазое говно.
#2889731/40 2017-11-17 22:21:30
@killy
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. https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/StringsAndCharacters.html
#2889731/41 → /23 2017-11-17 22:24:13
@killy
Haskell: > The character type Char is an enumeration whose values represent Unicode (or equivalently ISO/IEC 10646) characters (see http://www.unicode.org/ for details). https://downloads.haskell.org/~ghc/7.0.4/docs/html/libraries/base-4.3.1.0/Data-Char.html Если нужно grapheme clusters, то их тоже есть, в https://hackage.haskell.org/package/text-icu-0.7.0.1/docs/Data-Text-ICU.html
#2889731/42 → /23 2017-11-17 22:24:24
@max630
просто подключи icu в своём любимом языке.
#2889731/43 → /37 2017-11-17 22:25:47
@vt
Да, в прошлых беседах о хаскеле мне рассказывали что там есть десять разных стрингов
#2889731/44 → /42 2017-11-17 22:26:04
@killy
А ты слушай больше, что тебе рассказывают.
#2889731/45 → /44 2017-11-17 22:26:49
@vt
подключил: > Prelude Data.Text.ICU> Дальше что писать?
#2889731/46 → /43 2017-11-17 23:06:03
@killy
Я обнаружил, что для того, чтобы text-icu на винде поставить, надо icu скомпилировать, и отложил это дело, поэтому пока не скажу.
#2889731/47 → /46 2017-11-17 23:09:10
@killy
Хех. Итератор в js ходил бы по символам совсем правильно, если бы знал про combining marks. http://exploringjs.com/es6/ch_strings.html
#2889731/48 → /26 2017-11-17 23:20:26
@killy
Почти...
#2889731/49 → /48 2017-11-17 23:24:28
@killy
Как-то так: https://gist.github.com/KillyMXI/59ab7f79cc3127fecc8ad62bc05df5e5 1. если просто нужно измерить длину 2. методы поверх [Text](https://hackage.haskell.org/package/text-1.2.0.4/docs/Data-Text.html) 3. напрашивается свой тип данных вместо Text и String, копирующий подход Swift. ЗЫ. https://ghc.haskell.org/trac/ghc/ticket/8118 - кажется, это не проблемы с Windows - это проблемы с IO в принципе.
#2889731/50 → /42 2017-11-18 18:27:25
@vt
В общем, если подключить с помощью такой-то матери стороннюю либу, то в хаскеле можно руками написать нормальный стринг, но пока стринга там нет
#2889731/51 → /50 2017-11-18 18:35:43
@killy
Напутал с терминологией. Вместо Grapheme надо было какой-нибудь Symbol использовать.
#2889731/52 → /50 2017-11-18 18:36:00
@killy
Go: https://play.golang.org/p/xCVoBszCJA Число байт по умолчанию. Либо руны, которые combining characters считают раздельно (как Хаскель или итератор в js). Наткнулся на пример нормализации, но не знаю, как нужную либу загрузить в playground. Вместо этого посмотрел, как нормализацию в Хаскеле сделать: https://gist.github.com/KillyMXI/e19905ecf123f097cabcff6c1c999188
#2889731/53 → /23 2017-11-18 19:32:43
@max630
там длина как-то через жопу. У меня есть в истории ghci на десктопе, могу скопипастить потом
#2889731/54 → /46 2017-11-19 10:35:53
@max630
а эро гарантировано после normalize NF(K)C число Char-ов будет именно длина в смысле libicu?
#2889731/55 → /53 2017-11-19 10:38:33
@max630
как я уже сказал, это нужно не всегда. Вот у меня есть своя ребейзилка, там не нужно не то что icu, а вообще уникод как таковой, только возможность взять в одном месте и скопировать в другое место. А для задачи которая требует уникода можно и явно icu позвать
#2889731/56 → /51 2017-11-19 10:44:00
@max630
Prelude Data.Text Data.Text.ICU> Prelude.length $ breaks (breakCharacter Root) $ pack "é" 1
#2889731/57 → /54 2017-11-19 11:07:51
@killy
Не знаю про libicu. Не все combining marks можно нормализовать в один Char, поэтому результат будет отличаться от разбиения по видимым символам на необычных случаях вроде e⃣ (которые и так не везде нормально рисуются).
#2889731/58 → /55 2017-11-19 11:41:24
@killy
Сами по себе, NF(K)C и NF(K)D во всех имплементациях должны соответствовать своему определению в стандарте Юникода.
#2889731/59 → /55 2017-11-19 11:49:40
@killy
"👩‍❤️‍💋‍👩".count
#2889731/60 → /38 2017-11-19 15:16:12
@vt
1
#2889731/61 → /60 2017-11-19 18:42:27
@max630
у меня в jolla это 4 картинки, а на десктопном фаерфоксе в дебиане 1
#2889731/62 → /60 2017-11-19 18:44:41
@killy
Ни одна веб-песочница не может отобразить правильно. Сабмитят они, значит, тоже неправильно.
#2889731/63 → /61 2017-11-19 18:59:14
@vt
Консольный repl тоже отображает неправильно, но считает правильно
#2889731/64 → /63 2017-11-19 19:42:33