火狐扩展程序中的Web Worker无法正确地进行本地化字符串比较。

4
localeCompare()函数在Firefox扩展主代码和Web Worker(或Chrome Worker)中的行为不同。
例如,在主代码中,我有以下代码:
var array = ["École", "Frère", "frère", "école"];
array.sort(function(a, b) {
    return a.localeCompare(b);
});

console.log('Main: ' + array);

它显示:

Main: �cole,�cole,Fr�re,fr�re

哪种排序方式是正确的(编码不是我的问题)。

在 worker 中,我有这段代码:

var array = ["École", "Frère", "frère", "école"];
array.sort(function(a, b) {
    return a.localeCompare(b);
});

self.postMessage(array);

输出如下:

Frère,frère,école,�0cole

这是一个顺序错误的问题(再次强调,编码不是我的问题)。

主代码中的排序是正确的,但是在 web worker 中的排序不正确。

我尝试更改 web worker 中 localeCompare() 函数的选项,但没有任何变化。

为什么 web worker 中的排序与主代码中的排序不同?如何在 web worker 中得到正确的排序结果?

由于某种原因,我无法将数据发送到主代码中进行排序,然后再将其发送回 web worker。我仍然得到了错误的顺序(给我école,�0cole,Frère,frère)。

谢谢您的帮助。


我对你的“为什么”问题有一个可能的答案(本地回调不在工作线程上设置,new Date().toLocaleDateString() 也可能无法正常工作)。如果我是正确的,那么这是JS引擎问题,除了提交错误报告外,你无能为力。 - Wladimir Palant
注意:这看起来非常像https://bugzilla.mozilla.org/show_bug.cgi?id=616841,但那个错误很久以前就被修复了。而且那个错误实际上添加了一个单元测试来验证`String.localeCompare()`在Web Worker中是否正常工作。 - Wladimir Palant
new Date().toLocaleString() 在主代码和工作器中都会给我返回 mer 15 mai 2013 13:18:58 EDT。因此,该语言环境似乎在工作器中可以正常工作(至少对于日期而言)。最让我困惑的是,我无法将数组发送到主代码并在那里进行排序。您知道为什么我不能这样做吗?谢谢。 - antoyo
我在Firefox和Chrome中都遇到了同样的问题。它们似乎在Web Workers中使用的函数与常规浏览器中使用的函数不同(旧?)。你是否在任何地方找到/提交了这个bug?如果你找到了,我想跟进一下。 - redbmk
我没有。我可能会使用除Web Worker之外的其他解决方案。 - antoyo
1个回答

1

localeCompare在Firefox Web Workers中仍然存在问题。

Wladimir提到了Bug 616841,它确实几乎在所有地方都修复了它...除了Web Workers,在那里因为Intl后端不是线程安全的,或者存在其他线程安全问题而被留下了问题。相应的“死胡同”补丁从未得到审核或提交。

我现在提交了Bug 903780,其中包含基于您的代码的测试用例,以便localeCompare有望在将来得到修复。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接