当用Meteor (一个使用COMET进行实时推送的专用Web服务器)订阅名为“public”的频道时,我得到了所需的响应:
<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>
负责计算标题的文件使用这个正则expression式:
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阅读器,应用程序,Web服务器,这将有所帮助?
并提供一些细节,例如Meteor声称支持UTF-8,并且你configuration了它吗? 你还在什么平台上,这是一个客户端或服务器应用程序?
上面给出的第二个URL中的第一个字符(%D7%A7)是这个希伯来字符的UTF-8编码(D7 A7) – 可能发生的事情是GET以UTF-8正确编码浏览器和客户端应用程序),但是响应不是有效的UTF-8,或者客户端应用程序不能将其识别为UTF-8。
更新1 :
$chandef=~/^([a-z0-9_\-\%]+)(.(r|b|h)([0-9]*))?$/i匹配一个UTF-8字母数字等string – 请参阅编码CPAN模块和类似的编码/解码内置,只要你使用Perl 5.8+,最好是5.10 +。 任何时候你在代码中看到[az] ,都是国际化和Unicode的红旗。 这变成了一个StackOverflow的答案,所以我会在那里停止…