在令人不快的意外之后,逗号分隔值(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文件中的数字时似乎使用系统"小数分隔符".育.因此,如果您正在本地化列表分隔符,您可能也想要本地化小数分隔符.