Назад | Перейти на главную страницу

Проблема с unicode-каналом на сервере Meteor

При попытке подписаться на канал с названием "общедоступный" с Метеор, специализированный веб-сервер для push-уведомлений в реальном времени с использованием КОМЕТА, Получаю желаемый ответ:

<script>ch("public",0)</script>

Когда HTTP-запрос:

GET /push/131530959548387383/xhrinteractive/public?nc=1315309595740 HTTP/1.1

Но когда я пытаюсь подписаться на канал с названием на английском и иврите, например "tag- קוקאין", а HTTP-запрос выглядит так:

GET /push/1315309516300999786/xhrinteractive/tag-%D7%A7%D7%95%D7%A7%D7%90%D7%99%D7%9F?nc=1315309516590 HTTP/1.1

Получаю неловкий ответ - название канала стало точками:

<script>ch("tag-............", 0);</script>

Файл, отвечающий за определение заголовка, использует это регулярное выражение:

if($self->{'headerBuffer'}=~/GET\s+$::CONF{'SubscriberDynamicPageAddress'}\/([0-9a-z]+)\/([0-9a-z]+)\/([a-z0-9_\-\%\.\/]+).*?/i)
    {
        $self->{'subscriberID'}=$1;
        $self->{'mode'}=$2;
        my $persist=$self->getConf('Persist');
        my $maxTime=$self->getConf('MaxTime');
        $self->{'ConnectionTimeLimit'} = ($self->{'ConnectionStart'}+$maxTime) if ($maxTime>0);

        my @channelData=split('/',$3);
        my $channels={};
        my $channelName;
        my $offset;
        foreach my $chandef (@channelData) {
            if($chandef=~/^([a-z0-9_\-\%]+)(.(r|b|h)([0-9]*))?$/i) {
                $channelName = $1;
                $channels->{$channelName}->{'startIndex'} = undef;
                if ($3) {
                   $offset = $4;
                   if ($3 eq 'r') { $channels->{$channelName}->{'startIndex'} = $offset; }
                   if ($3 eq 'b') { $channels->{$channelName}->{'startIndex'} = -$offset; }
                   if ($3 eq 'h') { $channels->{$channelName}->{'startIndex'} = 0; }
                }
            }
        }

Могу добавить, что Meteor - это собственный сервер комет. его цель - отправлять уведомления в режиме реального времени: meteorserver.org

Где-то должно быть исправление ... Я пробовал искать везде, но безрезультатно. Буду признателен, если кто-то укажет мне какое-то направление.

Было бы полезно, если бы вы связались со страницей, описывающей, что такое Meteor - RSS-ридер, приложение, веб-сервер?

И укажите некоторые детали, например утверждает ли Meteor, что поддерживает UTF-8, и настроили ли вы его для этого? Также на какой платформе вы работаете, и это клиентское или серверное приложение?

Первый символ (% D7% A7) во втором URL-адресе, приведенном выше, является кодировкой UTF-8 (D7 A7) из этот еврейский символ - возможно, происходит то, что GET правильно кодируется в UTF-8 (по умолчанию для современных браузеров и клиентских приложений), но ответ либо недействителен UTF-8, либо клиентское приложение не распознает его как UTF- 8.

Обновление 1:

  • Код выглядит как Perl, у которого есть поддержка Unicode, но включение Unicode в Perl-приложение не всегда является простой задачей. Однако можно делать это порциями, например. просто есть это регулярное выражение $chandef=~/^([a-z0-9_\-\%]+)(.(r|b|h)([0-9]*))?$/i сопоставьте буквенно-цифровую строку UTF-8 и т. д. - см. модуль Encode CPAN и аналогичные встроенные функции кодирования / декодирования, если вы используете Perl 5.8+ и предпочтительно 5.10+. Каждый раз, когда вы видите [a-z] в коде это красный флаг для интернационализации и Unicode. Это превращается в ответ StackOverflow, поэтому я остановлюсь на нем ...
  • Вы не ответили на мои 2-й и 3-й вопросы, но из кода ясно, что Meteor не будет поддерживать UTF-8 без некоторых изменений кода.
  • Вам действительно нужно поговорить с разработчиками Meteor, поскольку это довольно специфично для этого сервера, см. http://meteorserver.org/how-to-join-in/