@TemaKam

Как исправить отличающийся символ в названии файла на macos и windows?

Если создать файл на винде, в названии которого будет буква "й", перекинуть его на мак, а затем создать файл на маке с таким же названием и сравнить их названия - они будут отличаться
64c7d39a0e8af853267744.jpeg
соответственно в коде на python сравнение также неправильно работает (список файлов через os.listdir()), кодировка при чтении содержимого не влияет на название
что нужно сделать, чтобы привести названия к 1 формату?

в байтах вот так названия
b'\xd0\xb4\xd1\x80\xd1\x83\xd0\xb7\xd0\xb5\xd0\xb9.txt'
- мак
b'\xd0\xb4\xd1\x80\xd1\x83\xd0\xb7\xd0\xb5\xd0\xb8\xcc\x86.txt'

os.path.normpath() не помогает

import os
s1 = b'\xd0\xb4\xd1\x80\xd1\x83\xd0\xb7\xd0\xb5\xd0\xb9.txt'
s2 = b'\xd0\xb4\xd1\x80\xd1\x83\xd0\xb7\xd0\xb5\xd0\xb8\xcc\x86.txt'
print(s1.decode("utf-8"), s2.decode("utf-8"), sep="\n")
print(s1.decode("utf-8") == s2.decode("utf-8"))
print(os.path.normpath(s1.decode("utf-8")) == os.path.normpath(s2.decode("utf-8")))
  • Вопрос задан
  • 148 просмотров
Решения вопроса 1
fenrir1121
@fenrir1121
Начни с документации
В linux и macos все кодировки по-умолчанию совпадают с UTF-8, а windows с ее cp1251 и cp866 для любителей острых ощущений.
Что касается нормализации, есть 4 вида: NFC, NFD, NFKC и NFKD
В разницу композиции и декомпозиции углубляться не буду, для этого есть документация и W3C, но отмечу что NFKC и NFKD могут приводить к потере данных, поэтому лучше использовать NFC, а остальные использовать если ее недостаточно.

from unicodedata import normalize

def eq_nfc(str1, str2):
    return normalize('NFC', str1) == normalize('NFC', str2)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@TemaKam Автор вопроса
chatgpt дал такое решение
unicodedata.normalize('NFKC', s1_decoded)) == unicodedata.normalize('NFKC', s2_decoded)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы