„Żółć”, nie „z˙o´łc´”: jak NFC Upload Filename Fix ratuje polskie litery w Send to Kindle

Jeśli wysyłasz pliki na Kindle’a przez stronę Send to Kindle z Chrome albo Brave na Macu, mogłeś zobaczyć coś takiego: plik nazywa się Zażółć gęślą jaźń.pdf, a na czytniku pojawia się jako Zaz˙o´łc´ ge˛s´la˛ jaz´n´. Z Safari ten sam plik dochodzi normalnie.

Napisałem małe rozszerzenie, które to naprawia: NFC Upload Filename Fix (działa w Chrome i w Brave). Zanim jednak przejdę do opisu instalacji, wyjaśnię, skąd ten błąd się bierze. Wbrew pozorom to nie jest zwykła usterka, tylko skutek sporu, który trwa od ponad dziesięciu lat.

Jedna litera, dwa zapisy

Komputer nie przechowuje liter, tylko numery. Tabela, która przypisuje literom numery, nazywa się Unicode. Na przykład a ma numer 97, a ż numer 380.

Litery z kropkami, kreskami i ogonkami można jednak zapisać na dwa sposoby:

  • jako jeden znak: gotowe ż,
  • jako dwa znaki: zwykłe z i osobną kropkę, która „dokleja się” do litery przed nią.

Na ekranie oba zapisy wyglądają identycznie. Pierwszy nazywa się NFC, drugi NFD. Prawie cały internet, Windows i Linux używają NFC. Mac zapisuje nazwy plików w NFD.

Według Unicode to wciąż ta sama litera i programy powinny traktować oba zapisy jednakowo. Wiele tego nie robi. Wtedy kropka zostaje osobnym znakiem i ląduje obok litery, tak jak w nazwie z czytnika.

Dlaczego Safari działa, a Chrome nie

Kiedy wybierasz plik do wysłania z komputera macOS, przeglądarka pyta system o jego nazwę i dostaje ją w NFD. Safari przed wysłaniem skleja litery z powrotem w NFC. Chrome i Brave (Firefox też) wysyłają nazwę bez zmian. Serwery Amazona spodziewają się NFC, bo tak wysyła prawie cały świat, i rozsypane litery trafiają prosto do biblioteki Kindle.

Dlaczego Chrome tego nie poprawi? Bo według zasad robi wszystko dobrze.

Spór sprzed lat

Przeglądarki działają według wspólnego zbioru zasad, specyfikacji HTML. Jeśli wszyscy się ich trzymają, strona działa tak samo w każdej przeglądarce.

W 2011 roku ktoś zgłosił, że jego serwer nie radzi sobie z nazwami plików w NFD (zgłoszenie 14526). Okazało się, że każda przeglądarka robi co innego: Safari i ówczesny Chrome wysyłały NFC, a Firefox i Opera to, co podał system. Redaktor specyfikacji, Ian Hickson, dopisał więc zasadę: zawsze NFC.

Szybko jednak pojawiły się sprzeciwy, głównie z Japonii. Zamiana na NFC potrafi zmienić niektóre znaki japońskie na inne, a dwa różne pliki mogą po niej dostać tę samą nazwę. W 2012 roku zasadę wycofano. Od tamtej pory przeglądarka ma wysyłać nazwę dokładnie taką, jaką ma plik na dysku.

Apple się z tym nie zgodziło i Safari dalej skleja litery, bo „tak po prostu działa”. Chrome w 2013 roku przeszedł na własny silnik i zaczął trzymać się zasad. Prośby o powrót do starego zachowania twórcy Chrome zamknęli z odpowiedzią, że to serwery powinny się dostosować.

W efekcie Chrome trzyma się zasad, Safari robi to, co w praktyce działa, a Amazon zakłada NFC. Pośrodku zostaje użytkownik Chrome na Macu.

Co robi rozszerzenie

To samo co Safari: zanim nazwa pliku opuści przeglądarkę, skleja litery z powrotem w NFC. Zawartości pliku nie rusza, a nazw, które już są poprawne, nie zmienia.

A co z ostrzeżeniami z 2011 roku? Przy polskich literach nie mają znaczenia: ż w obu zapisach to dokładnie ta sama litera. Ryzyko dotyczy tylko niektórych znaków japońskich, i to wyłącznie na stronach, które sam dodasz do listy.

Jak włączyć je dla Send to Kindle

Po instalacji rozszerzenie nie działa nigdzie. Strony, na których ma działać, wskazujesz sam:

  1. Wejdź na amazon.com/sendtokindle.
  2. Kliknij ikonę rozszerzenia (niebieskie ż).
  3. Kliknij podpowiedzianą domenę amazon.com, a potem Dodaj.
  4. Zgódź się na dostęp, kiedy przeglądarka zapyta.
  5. Odśwież stronę i wyślij plik.

Każdy kraj Amazonu to osobna domena. Jeśli korzystasz z amazon.de albo amazon.co.uk, dodaj ją osobno.

W ustawieniach rozszerzenia jest też strona testowa. Przeciągnij na nią plik z polskimi literami w nazwie. Jeśli wszystko gra, zobaczysz „NFC ✅”.

Ciekawostka: jak Send to Kindle wysyła plik

Można by pomyśleć, że strona po prostu wysyła plik razem z nazwą. Tymczasem robi to w trzech krokach:

  1. Zapowiada plik. Mówi Amazonowi, jaki jest duży i jakiego typu, ale bez nazwy. W odpowiedzi dostaje jednorazowy adres, pod który może go wgrać.
  2. Wgrywa samą zawartość. Nazwa nadal nie wychodzi z przeglądarki.
  3. Prosi o dodanie do biblioteki. Dopiero tu wysyła nazwę pliku i tytuł dokumentu. Ten tytuł zobaczysz potem na czytniku.

Nazwę strona wpisuje do zlecenia samodzielnie, odczytując ją z pliku. Dlatego rozszerzenie nie może tylko poprawić formularza. Musi podać stronie poprawną nazwę już w chwili, gdy ta po nią sięga. Robi to na każdej drodze, którą strona może dostać plik: przez przycisk „Wybierz plik”, przez przeciąganie i przez wklejanie.

Jak sprawdzić, że działa (dla dociekliwych)

Rozszerzenie ma tryb diagnostyczny. Na stronie Send to Kindle otwórz konsolę (⌥⌘J), wpisz localStorage.nfcDebug = 1, naciśnij Enter i odśwież stronę. Jeśli konsola nie pozwala wkleić tekstu, wpisz najpierw allow pasting. Po wysłaniu pliku powinieneś zobaczyć komunikat, że nazwa poszła do serwera poprawnie. Wyłączasz go poleceniem localStorage.removeItem('nfcDebug').

Prywatność

Rozszerzenie działa tylko na stronach, które sam dodasz do rozszerzenia. Niczego nie zbiera ani nigdzie nie wysyła, a jego kod jest jawny.

Czego nie naprawi

  • Plików wysłanych wcześniej. Przykładowo książki trzeba usunąć z biblioteki Kindle i wysłać jeszcze raz,
  • Wysyłania inną drogą niż przez przeglądarkę, czyli mailem, przez aplikację Send to Kindle albo z telefonu.
  • Stron, których nie dodasz do listy.

Dodaj komentarz

Ta strona używa Akismet do redukcji spamu. Dowiedz się, w jaki sposób przetwarzane są dane Twoich komentarzy.