LINUX.ORG.RU
ФорумTalks

Для Питонистов появилась статья «Почему вы не можете перевернуть строку с флагом Emoji?»

 , ,


1

1

Собственно, сабж. https://davidamos.dev/why-cant-you-reverse-a-flag-emoji/

Enjoy your unicode.

★★★★★

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

Сжатие ничерта не логично пихать в кодировку. Вот у тебя есть юникод строчка в 200 байт, сколько там символов? Правильно - хз.

ya-betmen ★★★★★
()

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

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

Всякие смыйлы туда вообще класть не надо, такое должно быть картинками.

Вот согласен. Текст должен оставаться текстом. Можно воткнуть всякие символы, которые вполне понятны и в обычном монохромном представлении (как текст — background и foreground), а цветам место не в кодировке текста, а в чём-то внешнем.

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

Почему мерзота?

Да потому, что нельзя без перебора сообщения по байтикам понять ничего про это сообщение, нельзя взять и переставить символы, нельзя отрезать один символ, ничего нельзя пока не копаясь в байтиках.

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

И будут, во-первых, несовместимые по размеру символа кодировки, во-вторых, текст в 95% случаев будет занимать в 5 раз больше места, чем следовало бы.

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

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

несовместимые по размеру символа кодировки

Так юникод сам с собой несовместим по размеру символа.

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

Мне-то пофиг, и десктопу тоже пофиг. А вот бд лора распухнет заметно, например.

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

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

А вот бд лора распухнет заметно, например.

Система хранения (бд) может использовать любой удобный ей способ сжатия данных.

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

А вообще, конечно, юникод недостаточно гибок, ему недостаёт поддержки иерархических структур. Довольно сложно простым объединением символов описать, например, пять красных прямых линий с указанием индивидуальных особенностей каждой.

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

А какую кодировку нужно использовать, чтобы набрать, например, русско-японский или русско-вьетнамский словарь?

Да хотя бы русско-английский с транскрипцией и корректной типографикой пусть в однобайтной кодировке наберет.

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

А если через 30 лет япошки решат поменять начертания части иероглифов - всё, сливай вёсла, проблема 2000 подкралась внезапно?

izzholtik ★★★
()

Статья шикарная. Всё разжёвано очень подробно и показано наглядно.

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

Какой-то чудак решил развернуть строку с юникодным символом стандартными средствами языка

Работает в нормальных прикладных языках (swift, elixir).

И это плохо. Потому что кто-то может решить, что это очень простая тема. А в более солидных ЯП это работает? Java, например.

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

Ходил. Вот Вы, видимо, никогда не пользовались пайпами в Питоне.

Эта самая встроенная библиотека, которая «import pipes», просто не позволяет задать тип «wb». У неё в исходнике захардкожен исключительно «w». Т.е. текстовый пайп. Соответственно, в UTF-8.

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

не могу сейчас ответить аргументировано, но есть подозрение, что эта библиотека просто не предназначена для работы с бинарными файлами, т.е. ты пытаешься ее использовать не по назначению. что можно делать с бинарными данными в пайпах?? могу только посоветовать использовать uuencode/uudecode. у меня по этой теме ничего не гуглится - видимо, не очень популярная хотелка среди юзеров пихтона

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

Бинарные пайпы в юниксах вполне себе существуют и применяются для работы с бинарными данными. Например, для передачи архивов, картинок, видео, музыки,... и т.д.

В чистом bash'е можно легко сделать, например, так:

tar Oxvf archive.tar.xz file.mp4 | ffmpeg -i - newgif.gif
(файл file.mp4 будет извлечён из архива archive.tar.xz, а затем передан ffmpeg'у, который сконвертирует его в гифку; да, это можно и через временные файлы делать, но зачем тогда пайпы?)

В общем, для линуксоидов бинарные пайпы must have. А скриптовые языки наподобие Perl'а, Ruby и Python'а изначально предполагаются как более удобные и более функциональные заменители bash'а. Но, вот, в случае с Python'ом как-то не совсем это получается.

Да, у меня есть мой костыль, но и он предполагает, что у скрипта уже есть данные, которые нужно передать дальше.

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

Впрочем,

os.system('tar Oxvf archive.tar.xz file.mp4 | ffmpeg -i - newgif.gif')
никто не отменял, да. С этой стороны Python хорошо справляется, да.

Но для передачи по пайпу бинарных данных из самого скрипта без моего костыля не обойтись, да.

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

from pipes import *

def open(self, file, rw):
        if rw == 'r':
            return self.open_r(file)
        if rw == 'w':
            return self.open_w(file)
        if rw == 'rb':
            return _open_rb(file)
        if rw == 'wb':
            return _open_wb(file)
        raise ValueError('Template.open: rw must be \'r\' or \'rb\' or \'w\' or \'wb\', not %r'
                         % (rw,))

def _open_r(self, file):
    if not self.steps:
        return open(file, 'rb')
    if self.steps[-1][1] == SINK:
        raise ValueError('Template.open_rb: pipeline ends width SINK')
    cmd = self.makepipeline(file, '')
    return os.popen(cmd, 'rb')

def _open_w(self, file):
    if not self.steps:
        return open(file, 'wb')
    if self.steps[0][1] == SOURCE:
        raise ValueError('Template.open_wb: pipeline begins with SOURCE')
    cmd = self.makepipeline('', file)
    return os.popen(cmd, 'wb')

Template.open = _open
Template.open_rb = _open_rb
Template.open_wb = _open_wb

И дальше:

import mypipes as pipes

Virtuos86 ★★★★★
()
Ответ на: комментарий от Virtuos86
return os.popen(cmd, 'wb')

Вы это тестировали? По документации там также только 'r' и 'w'. Плюс, в документации чёрным по белому сказано:

The returned file object reads or writes text strings rather than bytes.

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

использовать тот же SVG как стандарт

какашка в юникоде это 2-4 байта, а в свг - сотни иили тысячи байт

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

Вы это тестировали?

Очевидно, нет. Это чистой воды proof-of-concept. Немного манки-патчинга. Можно через обычный open с соответствующим флагом попробовать.

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

А как написать 🇺 🇸 без пробела чтобы не получился флаг?

cvs-255 ★★★★★
()
Ответ на: комментарий от Virtuos86

И это плохо. Потому что кто-то может решить, что это очень простая тема. А в более солидных ЯП это работает? Java, например.

Swift специально делали из расчета, чтобы разработчики меньше думали (над такими вещами). Из их документации:

String should:

  • honor industry standards such as Unicode
  • when handling non-ASCII text, deliver «reasonably correct» results to users thinking only in terms of ASCII

Естественно, что в других языках, которым более 10 лет, таких целей не ставили.

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

Где статья с «Зачем вообще переворачивать строки», кстати?

Это принцип я бы раньше назвал anti-KISS или anti-YAGNI.

Но, оказывается, у него есть другое имя - «Feature Creep», и он обычно используется для разработки Bloatware.

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

Проблема не в питоне а в том, что юникодный комитет окончательно поехал крышей и решил запилить восьмибайтные символы, которые невозможно отличить от пары четырехбайтных.

Хз что с этим делать, но понятие кодировки они сломали.

ya-betmen ★★★★★
()
Ответ на: комментарий от Mirage1_

Переворачивать строки может потребоваться по разным причинам.

Например, чтобы откусить что-нибудь от строки с другой стороны, а потом опять перевернуть обратно. Например, простой способ получить список установленных rpm-пакетов в bash'е выглядит так:

rpm -qa | rev | cut -d- -f 3- | rev
Тут суть в том, что имена пакетов тоже могут содержать символ '-', и заранее неизвестно сколько их в каком имени пакета. Поэтому проще откусить пару полей с конца. Но отсчёт полей начинается с начала.

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

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

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

Метки объединения символов ненужны. Делайте флаги отдельными символами

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

Например, простой способ получить список установленных rpm-пакетов

Тебя обманули: это не простота, а кюльзизобство. Простой способ таков: rpm -qa --qf '%{name}\n'.

dexpl ★★★★★
()

Я аналогичную статью читал еще года три назад. И там же утверждалось, что лучше всего с такой задачей справляется js

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