netch80: (Default)
[personal profile] netch80
$ export F=`printf "\xff\xfe\xfd"`
$ python3 -c 'import os; print(repr(os.environ["F"]))'
'\udcff\udcfe\udcfd'
$ python3 -c 'import os; print(os.environ["F"].encode())'
Traceback (most recent call last):
File "", line 1, in
UnicodeEncodeError: 'utf-8' codec can't encode characters in position 0-2: surrogates not allowed
зачем ловить медведя, если потом он тебя не отпустит?

Date: 2021-07-02 03:20 pm (UTC)
gegmopo4: (Default)
From: [personal profile] gegmopo4
os.fsencode()

$ export F=`echo йцукен | iconv -t koi8u`
$ python3 -c 'import os; print(os.fsencode(os.environ["F"]))'
b'\xca\xc3\xd5\xcb\xc5\xce'
$ python3 -c 'import os, sys; sys.stdout.buffer.write(os.fsencode(os.environ["F"]))' | iconv -f koi8u
йцукен

Date: 2021-07-02 08:09 pm (UTC)
gegmopo4: (Default)
From: [personal profile] gegmopo4
Підвищеної уваги потребує робота з кодуванням тексту взагалі. Краще завжди явно вказувати спосіб кодування. Але оскільки середовище може бути як байто-орієнтованим, так і тексто-орієнтованим, то приходиться зводити інтерфейс до спільного знаменника, і це — тип str, який може включати і невалідні коди які взаємно-однозначно кодують артефакти зовнішнього представлення.

Оригінальний приклад простий і має очевидне рішення. Гірше, коли просто виводиш значення змінної середовища або їм'я файла (з os.listdir() або os.getcwd()). Це текст? Текст. Стандартний вивід приймає текст? Текст. Так де ж вказувати яке кодування щоб отримати бажаний результат?

Все ж, гадаю, в Пітоні з цим справа краще, ніж в інших мовах програмування, де або валиться до того, як користувацький код має змогу обробити помилку, або незворотньо псують дані, або залишають користувача з голим системно-залежним представленням, яке потрібно вручну декодувати перш ніж з ним можна працювати. Не ідеал, але ідеал тут взагалі неможливий.

Date: 2021-07-02 04:12 pm (UTC)
vitus_wagner: My photo 2005 (Default)
From: [personal profile] vitus_wagner

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

``` LANG=ru_RU.CP1251 python3 -c 'import os; print(os.environ["F"])'|iconv -f cp1251

яюэ ```

Edited Date: 2021-07-02 04:12 pm (UTC)

Date: 2021-07-03 07:06 am (UTC)
vitus_wagner: My photo 2005 (Default)
From: [personal profile] vitus_wagner

Змейсы они такие - начала заглотят, а потом не знают, как выплюнуть.

Profile

netch80: (Default)
netch80

January 2026

S M T W T F S
    1 23
45678910
11121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 2nd, 2026 08:43 pm
Powered by Dreamwidth Studios