Алексей Иванов (alexyv) wrote,
Алексей Иванов
alexyv

Category:

Кракозябры Flickr

English version

С середины августа статистика Flickr перестал показывать поисковые запросы, в которых показывались мои фотографии. Точнее они показываются, только вместо русских слов там кракозябры.

Подробная статистика просмотра фотографий доступна владельцам Pro-аккаунтов на Flickr, если они захотели ее получать. Благодаря этой статистике, я обнаружил свои фотографии в Wikipedia, а также на других сайтах.

Вот часть снимка экрана страницы со статистикой:
Part of Flickr referrer statistics page

Английские поисковые запросы отображаются правильно (было бы странно, если бы это было не так). А вот 37 и 38 позицию занимают какие-то непонятные сущности. Если по ним щелкнуть, то, естественно, ничего не находится.

Двойное кодирование в UTF-8

Я сразу же предположил, что тут дело в кодировках. Причем не на самой странице, а где-то в недрах.

Большинство страниц в интернете используют кодировку UTF-8. В этой кодировке одна кириллическая буква занимает два байта, а не один. И вот подобную строку, уже закодированную в UTF-8, кодируют в UTF-8 еще раз. Естественно, получается абракадабра какая-то. Но это было лишь мое предположение.

Кодер-декодер на Java

Чтобы доказать свое предположение, я написал маленькую программку на Java:

import java.io.IOException;


public class DoubleEncoding {

    public static void main(String[] args) throws IOException {
        // Step 1
        String so = "океан";
        byte[] bb = so.getBytes("UTF-8");
        for (byte b : bb) {
            System.out.print(Integer.toHexString(b & 0xFF) + ", ");
        }
        System.out.println();

        // Step 2
        String sc = new String(bb, "Windows-1252");
        System.out.println(sc);
        bb = sc.getBytes("UTF-8");
        for (byte b : bb) {
            System.out.print(Integer.toHexString(b & 0xFF) + ", ");
        }
        System.out.println();

        // Step 3: reverse conversion
        String se = new String(bb, "UTF-8");
        bb = se.getBytes("Windows-1252");
        String sd = new String(bb, "UTF-8");
        System.out.println(sd);
    }

}

В результате выполнения получим следующее:

d0, be, d0, ba, d0, b5, d0, b0, d0, bd, 
океан
c3, 90, c2, be, c3, 90, c2, ba, c3, 90, c2, b5, c3, 90, c2, b0, c3, 90, c2, bd, 
океан

Если в третьем шаге подставить строку, скопированную из статистики Flickr, например:

String se = "океан";

То получим декодированную строку на русском:

океан

Таким образом, моя теория стала полностью подтвержденной.

Техническая поддержка Flickr

После этого я написал в техническую поддержку Flickr с подробным описанием проблемы. Первый ответ был простой отпиской, отвечающей на вопрос, что делать, если у меня не получается залогиниться. Еще раз подробно описал, в чем состоит моя проблема, и приложил программу, наглядно демонстрирующую, что происходит не так. До сих пор не получил ответа, и проблему никто не устранил.

Подобной проблеме с кодировками подвержены любые символы, которые выходят за рамки ASCII, то есть обычной латиницы без диакритических знаков. В том числе, буквы с умляутами в немецком ä, буквы с ударением в испанском á, с другими диакритическими знаками во французском â, греческие буквы α. Но все же говорят на английском! Поэтому этого бага никто не видит.

Графический декодер

А мне же интересно, какие русские слова искали. Поэтому я написал более удобный инструмент для декодирования кракозябров:
Flickr decoder

Графическим интерфейсом пользоваться гораздо удобнее: скопировал строку из браузера, вставил в поле Search term и сразу же получил результат в поле Decoded ниже.

В программе используется тот же самый алгоритм декодирования строки из шага номер 3 в исходном тексте выше.

Установка

Как этим пользоваться? Скачать на компьютер decodeFlickr.jar и дважды щелкнуть по нему, чтобы запустить.

Так как программа написана на Java, то на вашем компьютере должна быть установлена среда выполнения Java (JRE): скачайте последнюю версию и установите ее.

Немного сложно… Зато подобная программа на Java отлично работает не только в Windows, но и в Linux и Mac — везде, где есть Java.

Java Web Start

Я хотел сделать запуск через Java Web Start, JNLP, но не получилось. Точнее не совсем получилось. Программа запускается, но из-за соображений безопасности у нее нет доступа к буферу обмена. Нужно либо подписать .jar файл (что не представляется возможным), либо дополнительно запросить у SecurityManager доступ к буферу обмена. Но я пока поленился это делать.

Tags: flickr, java, программирование
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 2 comments