8

在对逗号分隔值(CSV)文件不一定是逗号分隔感到不快之后,我试图找出是否有任何方法可以从 http 请求检测客户端计算机上的区域设置列表分隔符值。

场景如下:用户可以从网站下载一些 CSV 格式的数据(RoR,如果重要的话)。该 CSV 文件是动态生成的,发送给用户,并且大部分时间在目的地的 Windows 机器上双击并在 MS Excel 中打开。现在,如果用户将“,”设置为列表分隔符,则数据将正确排列在列中,但如果设置了任何其他分隔符(此处广泛使用“;”),则所有内容都将被放入单个列中。那么,有什么方法可以检测客户端机器上使用的分隔符,并相应地生成文件?

我有一种沉没的感觉,但我想在我将“无法完成,抱歉”这一行传递给客户之前确定 :)

4

5 回答 5

14

这是我刚刚根据此处显示的方法编写的 JavaScript 解决方案:

function getListSeparator() {
    var list = ['a', 'b'], str;
    if (list.toLocaleString) {
        str = list.toLocaleString();
        if (str.indexOf(';') > 0 && str.indexOf(',') == -1) {
            return ';';
        }
    }
    return ',';
}

关键在于使用系统列表分隔符的 toLocaleString() 方法。

您可以使用 JavaScript 获取列表分隔符并将其设置在 cookie 中,然后您可以从服务器中检测到该 cookie。

我检查了所有的 Windows 语言环境,似乎默认的列表分隔符几乎总是“,”或“;”。对于某些语言环境,控制面板中的下拉列表提供了两个选项;对于其他人,它只提供','。一种语言环境 Divehi 有一个我以前从未见过的奇怪字符作为列表分隔符,并且对于任何语言环境,用户都可以输入他们想要的任何字符串作为列表分隔符。

将随机字符串作为 CSV 文件中的分隔符对我来说听起来很麻烦,所以我上面的函数只会返回一个 ';' 或一个'.',它只会返回一个';' 如果在 Array.toLocaleString 字符串中找不到“,”。我不完全确定 array.toLocaleString 是否具有跨浏览器保证的格式,因此 indexOf 检查而不是在特定索引处挑选字符。

使用 Array.toLocaleString 获取列表分隔符适用于 IE6、IE7 和 IE8,但不幸的是,它似乎不适用于 Firefox、Safari、Opera 和 Chrome(或者至少是我计算机上的这些浏览器的版本):无论 Windows 的“列表分隔符”设置如何,它们似乎都用逗号分隔数组项。

另外值得注意的是,默认情况下,Excel 在解析 CSV 文件中的数字时似乎使用系统“小数分隔符”。玉。因此,如果您要本地化列表分隔符,您可能还需要本地化小数点分隔符。

于 2010-05-11T17:12:48.950 回答
1

我认为每个人都应该使用 OpenOffice 中的 Calc——它会询问您何时打开有关编码、列分隔符等的文件。我不知道您的问题的答案,但也许您可以尝试在 html 表或 xml 中发送数据 - excel 应该正确读取它们。根据我的经验,将数据导出到 Excel 并不容易。几周前我遇到了问题,经过几个小时的工作,我向一个无法在 excel 中打开我的 csv 文件的人询问版本。这是Excel 98...

看看html 示例xml

于 2009-06-18T15:01:21.193 回答
1

getListSeparator 函数的更简单版本,允许任何字符作为分隔符:

function getListSeparator_bis()
{
    var list = ['a', 'b'];
    return(list.toLocaleString().charAt(1));
}// getListSeparator_bis

只需在您的操作系统中将任何字符(fe'#')设置为列表分隔符,然后尝试上面的代码。返回适当的字符(即“#”,如果设置为 sugested)。

于 2010-12-13T22:07:05.160 回答
0

您是否可以让具有非逗号分隔符的用户设置一个配置文件类型的选项,然后根据用户设置生成 CSV,默认为逗号?

于 2009-06-18T14:53:01.897 回答
0

汤姆斯,据我所知,没有办法实现你所追求的。您最多可以尝试检测用户区域设置并将其映射到区域设置/列表分隔符的数据库,从而更改 .CSV 文件中的列表分隔符。

于 2009-06-18T14:59:39.853 回答