«Обратная косая черта внутри иероглифа "gōng": два слоя налогов на умолчания, которые тайваньские инженеры платят каждый день»

В Windows 11 с языковой настройкой zh-TW скрипт статуса перевода свалил все отсканированные 4500+ путей в root, Technology стало нулю, а в ту же неделю CI в Linux был зелёным. Скрипт резал категории прямой косой, а на диске — обратная, не вырезало. Старейший слой зарыт в самом иероглифе: второй байт Big5 у "gōng" — это ASCII обратная косая черта, разработчики называют это "Сюй Гуньгай". И как пишутся пути, и какие символы живут внутри иероглифов — умолчания не считали с этой машиной. Git'овский quotePath — отдельная линия, природа другая.

Большой иероглиф "gōng", рядом его код Big5 A5 и 5C в двух ячейках, от 5C стрелка указывает на ASCII 0x5C обратную косую черту; ниже — реальный вывод Python, у трёх иероглифов "Сюй Гуньгай" второй байт — обратная косая черта.
Фото: Taiwan.md Contributors(自製圖解)· CC BY-SA 4.0

30-секундный обзор: Я запустил скрипт статуса перевода, на экране вывелось 4546, всё в root. На GitHub CI в Linux — зелёный. Позже выяснилось две вещи. Обратная косая черта в путях Windows, скрипт режет прямой — не вырезает. Второй байт Big5 у "gōng" — это сам ASCII \. Две вещи, механизмы разные, но часто встречаются вместе на одной и той же繁中 Windows.

Я поддерживаю скрипт статуса перевода Taiwan.md на Windows 11 с языковой настройкой zh-TW. В тот вечер, как обычно, запустил i18n-status.py, ждал, пока терминал выведет цифры. Консоль — cp950. В выводе не было красного текста.

Экран остановился на 4546. Всё в одной категории под названием root. Technology — 0.

В ту же неделю запушил на GitHub, CI в Linux — зелёный свет.

Переменная скрипта называется zh_articles, она сканирует пути под knowledge, кроме английского, about и директорий с подчёркиванием в начале; японский, корейский, арабский тоже попадают в счёт. В тот вечер он не смог даже вырезать имена категорий, четыре тысячи путей ушли в одну ячейку. Никаких исключений, никаких предупреждений. Статистика выглядела так, будто весь сайт сломан, файлов не хватало ни одного.1

На диске пути выглядят как knowledge\Technology\какая-то-статья.md, папки разделены обратной косой чертой. Скрипт использует split('/') чтобы достать имя категории. В Linux это работает, потому что пути изначально с прямой косой. В Windows он не находит обратную косую, вся путь возвращается как есть, статья попадает в дефолтный root.2

После того как отдал обработку директорий pathlib, под Technology оказалось 59 статей, совпадает с содержимым папки. Между ними разделяет лишь одно предположение: какой чертой ваша машина разделяет папки.

Python терминал реальный вывод: тот же Windows путь режут split('/'), возвращает список из одного элемента; отдают PureWindowsPath(p).parts, вырезает knowledge, Technology, имя файла — три сегмента

Один и тот же путь, два способа резать. split('/') не находит прямую косую, возвращает весь путь как есть; PureWindowsPath знает обратную косую, Technology возвращается. Taiwan.md Contributors, CC BY-SA 4.0.

📝 Заметка куратора: Синтаксис скрипта не ошибочен, CI действительно прогонял тесты. Разрыв там, где «машина, за которой реально сидит автор» и «машина, которой думает инструмент». Этому зазору не принадлежит ни один этап, поэтому никто не отвечает за его наблюдение.

«Gōng» внутри — та самая черта

Пути — первый слой. Второй слой старше гораздо, зарыт в самом иероглифе.

Big5 утвердили в 1984 году, один китайский иероглиф — два байта. Если второй байт попадает в 0x40–0x7E, он перекрывается с ASCII-символами: [, ], {, }, \, |. Профессор кафедры управления информацией Чаоянского технологического университета Хун Чаогуй (ушёл на пенсию в августе 2023 года) писал на учебной странице: «Поскольку 40–7E — это диапазон ASCII кодов общеупотребительных символов, это иногда создаёт программистам затруднения.»3

Код «gōng» — A5 5C. Тот самый 0x5C в ASCII — обратная косая черта \. Программа, сканирующая строку побайтово и воспринимающая \ как escape или разделитель, наткнувшись на вторую половину «gōng», решит, что встретила путь. «Gōng» в имени файла, «gōng» в пути — оба могут здесь разбиться.

Тайваньские и гонконгские разработчики называют это «Сюй Гуньгай» (許功蓋): «Сюй» — B3 5C, «Gōng» — A5 5C, «Гай» — BB 5C, три частоупотребительных иероглифа подряд похожи на имя человека.4 Хун Чаогуй дополнительно перечислил «Цзя Е Чэнь Чжэнь Гун» (加也程陣功), вторые байты которых наезжают на [, ], {, }, \, и написал сканер b5tm.3 Багу дают человеческое имя обычно потому, что она встречается достаточно часто, и поколению нужно уметь указывать на неё и говорить.

В 2015 году автор блога «Тёмная нить» перешёл на Visual Studio 2015. Старые .cs всё ещё сохранялись в BIG5. После перехода компилятора на Roslyn, Сюй Гуньгай внутри файлов превращались в ошибки компиляции.

Через два дня коллега сказал, они тоже перешли и застряли надолго, в итоге полезли в поиск и попали обратно к той его статье. У одного читателя были тысячи файлов, конвертировал один — ещё куча, «пришлось сказать VS2015 Goodbye». Позже он написал маленький батник для пакетной конвертации в UTF-8, потому что ручное «Сохранить как» не успевал.5

Это не то же самое, что split('/') выше. Одно — современные инструменты предполагают, как выглядит путь. Другое — сорок лет назад выбрали двухбайтовое представление, и внутри тела иероглифа поселился символ. Механизмы разные, но счета часто приходят вместе на одной и той же cp950 машине. Как с той стороны вводят иероглифы в компьютер — см. восточноазиатские методы ввода. Здесь речь о том, когда иероглиф уже на диске, узнаёт ли его цепочка инструментов.

Умолчания не открывали для этой машины ветку

Git по умолчанию включает core.quotePath. Имена файлов с байтами больше 0x80, git status печатает как \344\270\255 — такие восьмеричные последовательности. Китайские имена файлов на месте, просто вы каждый день не понимаете, что говорит ваш репозиторий.6 Он экранирует старшие байты UTF-8. Big5 0x5C — другая линия. Выглядят обе как обратная косая черта, природы разные.

Терминал реальный вывод: git status --short печатает китайское имя файла из этой статьи как восьмеричные escape-последовательности в кавычках; с -c core.quotePath=false то же имя печатается китайскими символами

Один и тот же файл, под дефолтом — строка \345\212\237. Здесь обратная косая черта — экранирование, добавленное Git'ом, отношения к тому 0x5C внутри «gōng» не имеет. Taiwan.md Contributors, CC BY-SA 4.0.

Python 3 в Windows, если open() без encoding='utf-8', может унаследовать системную локаль. Тот же UTF-8 файл, Linux прочитает, эта машина через cp950 попытается раскодировать — пунктуация или жуинь сломаются.7 Я сам платил один раз: использовал PowerShell 5.1 Get-Content | Set-Content чтобы переделать UTF-8 файл, длинное тире в diff превратилось в ??. Тот тоже налог на умолчания, не вторая тема.

Когда статус-сообщения несут emoji, эта cp950 консоль падает напрямую. В наборе символов их нет, Python не может напечатать, исключение летит наверх. Linux CI это не ловит, потому что не на этой машине гоняет.

Git, Python, примеры путей в CI с $HOME/project/src — не открывали для zh-TW Windows отдельную ветку.

Хун Чаогуй в 2015 году дал интервью iThome, говорил, в каком формате правительству открывать файлы и как долго они живут. Репортаж передаёт его смысл: если правительство только продуктами Microsoft открывает файлы данных, это равносильно вере, что срок жизни Microsoft будет длиннее Китайской Республики.8 Та фраза про форматы файлов и сроки хранения. К какой цепочке дефолтных инструментов привязаны данные, время растянешь — становится вопросом, кто ещё сможет прочитать. Открытая коллаборация привязана к дефолтному окружению определённого типа машины. Напряжение между гражданскими технологиями и правительственными форматами файлов — см. сообщество открытого кода и g0v. Культура, которой тайваньские разработчики долго поглощали этот разрыв — см. тайваньский дух открытого кода.

Разделитель путей, кодировка терминала, $HOME в примерах CI — не было ветки, открытой для этой машины. В тот день, когда 4546 путей ушли не в ту категорию, ни одна строка кода не сообщила об ошибке. Статистика выглядела нормально, пока ты не сел за эту машину.

Дополнительное чтение

Источники изображений

  • Код Big5 «gōng» и обратная косая черта (hero): инфографика Taiwan.md Contributors, CC BY-SA 4.0, хранится в public/article-images/technology/big5-gong-5c-backslash.webp. Нижняя строка — реальный вывод Python 3 '許功蓋'.encode('big5'), кодовые позиции совпадают со статьёй Википедии о Big5.4
  • split('/') против PureWindowsPath: Taiwan.md Contributors, CC BY-SA 4.0, хранится в public/article-images/technology/windows-path-split-vs-pathlib.svg. Содержимое — реальные результаты выполнения Python 3; PureWindowsPath на любой ОС режет пути по правилам Windows, поэтому не нужна Windows-машина для воспроизведения.
  • Восьмеричный вывод Git core.quotePath: Taiwan.md Contributors, CC BY-SA 4.0, хранится в public/article-images/technology/git-quotepath-octal-cjk.svg. Содержимое — реальный вывод git status --short после добавления имени файла этой статьи во временный репозиторий; это поведение не зависит от ОС.

Ссылки

  1. taiwan-md PR #1260 — влит 2026-07-26. До фикса в Windows categories только root: 4546, после — Technology zh: 59. Одновременно убрали emoji, ронявшие cp950 консоль.↩
  2. Microsoft Learn: формат путей файлов в Windows — документация .NET объясняет, что классические DOS-пути используют обратную косую черту как разделитель директорий, прямая косая черта конвертируется в обратную.↩
  3. Хун Чаогуй: проблемы кода Big5, с которыми можно столкнуться при программировании — учебная страница перечисляет частоупотребительные иероглифы, вторые байты которых попадают в опасный ASCII-диапазон (Цзя Е Чэнь Чжэнь Гун), и представляет сканер b5tm. Внизу страницы должность не указана. iThome 2015 года называет его профессором. На его личной странице указано 1997–2023 гг. работа в Чаоянском управлении информацией, уход на пенсию в августе 2023 года.↩2
  4. Википедия: Big5 — указано «gōng» 0xA55C, «Сюй» 0xB35C, «Гай» 0xBB5C, и поясняется, что эту проблему шутят называют Сюй Гуньгай.↩2
  5. Тёмная нить: Потенциальный щит — решение проблемы совместимости BIG5 в VS2015 — запись 2015 года о том, как Visual Studio 2015 при компиляции исходников в BIG5 ломается на Сюй Гуньгай. В тексте есть «пришлось сказать VS2015 Goodbye».↩
  6. git-config: core.quotePath — официальная документация объясняет, что по умолчанию пути с байтами больше 0x80 отображаются как восьмеричные escape-последовательности.↩
  7. Python 3: open() — документация функции указывает, что при неуказанном encoding может использоваться системная локаль как кодировка по умолчанию.↩
  8. iThome: интервью Хун Чаогуй — интервью 2015 года, в тексте назван профессором кафедры управления информацией Чаоянского технологического университета. Оригинальная страница часто отдаёт 403, фраза про срок жизни Microsoft приводится только по пересказу в результатах поиска, не как дословная цитата.↩
Об этой статье Эта статья создана сообществом и написана/проверена с помощью ИИ.
Ключевые слова
открытое ПО Windows Big5 UTF-8 кодировка символов традиционный китайский
Поделиться

Дополнительные материалы

Вам также может быть интересно

Экономика Стандартная статья

Тайваньские компании: Acer — те, кто нарисовал улыбку, сами не смогли устоять на краях

В 1992 году Ши Чжэньронг начертил внутри Acer восходящую кривую, сказав всему тайваньскому производству: не застревайте в середине сборки с наименьшей добавленной стоимостью, а идите к концам — разработке и бренду. Эта фраза повлияла на Тайвань три десятилетия. Но сам человек, начертивший линию, трижды потерпел неудачу на пути к бренду: в 2000 году был вынужден разделиться с большой семьей, в 2011 году достиг второго места в мире, а затем столкнулся с переизбытком запасов, и в 2013 году компания потеряла 20,5 миллиардов, заставив основателя в шестьдесят восемь лет вернуться. А его младший коллега Wistron, которого он отделил тогда как наименее перспективного подрядчика, поднялся на вершину улыбки в эпоху ИИ.

閱讀全文
Культура Стандартная статья

Тайваньские устные коды: от «бадхаоисы» до «D читается как чжу» — как четыре повседневных выражения вырастили идентичность

На Тайване «бадхаоисы» может предшествовать настоящей извиниться; «ха» кажется непониманием, но это межъязыковой механизм ремонта диалога; @ называют «сяо лаошу», а D при обмене тетрадями произносят как «чжу/чжу». Четыре выражения прячут вежливость, недопонимание, электронную почту и тайваньскую фонологию в быт, напоминая: так называемый тайваньский акцент — не просто система произношения, а метод распознавания, оставленный людьми, живущими вместе.

閱讀全文
Личности Стандартная статья

Сю Мэйхуа: от противодействия Цзыгуан к массовому отзыву — десять лет анонимного гражданского кода

«Сю Мэйхуа» — не настоящее имя, а код, появившийся в тайваньском гражданском обществе в два ключевых момента: в 2015 году как одна из «четырёх рыцарей» она помогла заблокировать сделку по поглощению полупроводниковых предприятий китайской Цзыгуан, а в 2025 году стала самым контр интуитивным «центром донатов» в волне массового отзыва: не касаясь ни цента, она координировала более 20 миллионов гражданских пожертвований.

閱讀全文
Технологии Стандартная статья

justfont и развитие тайваньских шрифтов: باسم тайваньского чая — вывести мастеров шрифтов на солнце

8 сентября 2015 года утром шрифт «Цзиньсюань», названный в честь тайваньского чая, вышел на flyingV, за 76 минут преодолел порог в 1,5 млн, в итоге 7667 человек собрали 25,93 млн. Вся нация каждый день читает эти шрифты, но рынок когда-то был слишком мал, чтобы прокормить хоть одну компанию по созданию шрифтов. От Сы минти Хуакана, свинцовых шрифтов улицы Тайюань, до Линь Ся, пришедшей из рисования буддийских икон — это история о том, как Тайвань вывела мастеров шрифтов на солнце.

閱讀全文