从Web检测区域设置(列表分隔符)

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

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

我有一种沉闷的感觉,它不是,但我想确定在我通过’无法做到,对不起’线给客户之前:)

这是我刚刚根据此处显示的方法编写的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 Locales,似乎默认列表分隔符实际上总是’,’或’;’。 对于某些区域设置,“控制面板”中的下拉列表提供了两个选项; 对于其他人,它只提供’,’。 一个区域设置,Divehi,有一个奇怪的字符,我之前没有看到它作为列表分隔符,并且,对于任何区域设置,用户可以输入他们想要的任何字符串作为列表分隔符。

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

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

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

我想每个人都应该使用OpenOffice中的Calc – 它会在你打开一个关于编码,列分隔符和其他文件的文件时询问。 我不知道你的问题的答案,但也许你可以尝试在html表或xml中发送数据 – excel应该正确读取它们。 根据我的经验,将数据导出到excel并不容易。 几周前我遇到了问题,经过几个小时的工作后,我问了一个无法打开excel的csv文件的人。 这是Excel 98 …

看看html示例和xml 。

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

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

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

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

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