2025, Dec 19 12:03
Как исправить искажение польских символов при загрузке в YouTube через Python
Почему при загрузке видео в YouTube через Python ломаются польские символы и как это исправить: кодовые страницы Windows и конвертация CP852→UTF‑8 в скрипте.
При загрузке видео на YouTube через официальный пример на Python символы вне ASCII в заголовке и описании могут приходить искаженными. Польские диакритики, например, превращаются в странные значки. Тело запроса (payload) должно быть в UTF‑8, но текст, который вы передаёте из терминала, может быть в другой кодировке, и из‑за этого несоответствия символы портятся по пути.
Как воспроизвести проблему
Типичный вызов выглядит так:
python upload_video.py --file="DU.mp4" --title="Rozporządzenie" --description="Zapraszamy do odsłuchania nowej publikacji dziennika ustaw opublikowanego na stronie sejmu.
Tytuł: DU/2025/695 - Rozporzaogon;dzenie Ministra Rolnictwa i Rozwoju Wsi" --keywords="" --category="25" --privacyStatus="private" --noauth_local_webserverВ системах, где терминал работает со старой кодовой страницей, символы вроде ą, ę, ł, ź, ż не приходят в UTF‑8. Это можно наглядно увидеть по преобразованию:
>>> "ą".encode('utf-8').decode('852')
'─ů'Это демонстрирует ровно тот тип искажений, который виден после загрузки: исходный символ трактуется так, будто он пришёл из кодовой страницы 852. API YouTube ожидает UTF‑8 для заголовка и описания, поэтому неверная входная кодировка приводит к “ломаному” тексту.
Что происходит на самом деле
По умолчанию YouTube Data API принимает UTF‑8 для текстовых полей. Если ваш терминал работает в другой кодировке, аргументы командной строки декодируются соответственно ещё до того, как их увидит скрипт. Передавая эти строки напрямую в API, вы фактически отправляете неправильные байты. В Linux окружение обычно везде использует UTF‑8, поэтому несоответствие встречается реже. В Windows активная кодовая страница вроде 852 — тревожный знак, что текст в CLI не в UTF‑8. Причём даже переключение консоли на другую кодовую страницу, например 65001, может не спасти уже обработанный текст, если скрипт по‑прежнему читает аргументы с использованием старой кодировки; надёжнее всего нормализовать данные внутри скрипта.
Решение: нормализовать в UTF‑8 внутри загрузчика
Преобразуйте входной текст из кодовой страницы терминала в UTF‑8 до формирования запроса. Преобразование, которое возвращает исходные символы из ранее показанного искажения, такое:
restored = raw_text.encode('852').decode('utf-8')Ниже — минимальный, самодостаточный способ применить это к полям, которые вы отправляете в YouTube. Имена показаны для примера и могут быть адаптированы под место, где вы собираете тело запроса:
def to_utf8_from_cp852(s):
return s.encode('852').decode('utf-8')
# предполагаем, что cli_opts.title и cli_opts.description пришли из вашего парсера аргументов
fixed_title = to_utf8_from_cp852(cli_opts.title)
fixed_desc = to_utf8_from_cp852(cli_opts.description)
# далее при формировании тела запроса к API
payload = {
'snippet': {
'title': fixed_title,
'description': fixed_desc,
}
}Если удобнее преобразовывать “на месте” при присвоении, логика остаётся той же:
desc_text = cli_opts.description.encode('852').decode('utf-8')Чтобы убедиться, что именно приходит, можно посмотреть числовое значение отдельных символов. Это помогает понять, видит ли скрипт текст, декодированный как 852, или корректный UTF‑8:
# возьмите один символ из входной строки
ch = cli_opts.description[0]
code_point = ord(ch)
print(code_point)Для переносимого процесса полезно определять кодировку терминала и конвертировать соответствующим образом. В Python есть устоявшиеся способы получить кодировку терминала; эта дискуссия подскажет направление: https://stackoverflow.com/questions/6396659/how-do-you-get-the-encoding-of-the-terminal-from-within-a-python-script
Почему это важно
Заголовки и описания с “битой” диакритикой — это не просто косметика. Страдает читаемость, поиск и доверие. Если путь загрузки стабильно выдаёт UTF‑8, метаданные остаются пригодными на всём пути обработки в YouTube и не требуют ручных исправлений после загрузки.
Итоги
Если после загрузки на YouTube польские символы оказываются испорченными, причина — несоответствие между кодовой страницей вашего терминала и ожидаемым API UTF‑8. Нейтрализуйте рассинхрон внутри скрипта: преобразуйте из кодовой страницы консоли (например, 852) в UTF‑8 с помощью text.encode('852').decode('utf-8') и передавайте нормализованные строки в API. При необходимости сначала определите кодировку терминала и только затем применяйте преобразование. Эта небольшая доработка делает процесс загрузки устойчивым, независимо от того, где запускается скрипт.