【问题标题】:Detecting regional settings (List Separator) from web从 Web 检测区域设置(列表分隔符)
【发布时间】:2009-06-18 09:07:29
【问题描述】:

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

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

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

【问题讨论】:

  • 这是一个在人机界面讨论中出现的主题。弄清楚使用什么的最好方法是让用户在偏好中选择他们的位置。他们的机器可能由于无知或故意混淆而配置错误。

标签: ruby-on-rails ruby regional


【解决方案1】:

这是我刚刚根据here所示的方法写的一个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(或者至少我的这些浏览器的版本) computer):无论 Windows 的“列表分隔符”设置如何,它们似乎都用逗号分隔数组项。

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

【讨论】:

  • 我会投赞成票,因为它是一个聪明的解决方案。但就我而言,例如,浏览器的列表分隔符与操作系统的不同。 =/
  • 另一种解决方案是定义文件的分隔符:在 CSV 文件的第一行,列标题上方添加“SEP=”。它将强制 Excel 使用“,”作为分隔符来读取它。
【解决方案2】:

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

看看html examplexml

【讨论】:

    【解决方案3】:

    getListSeparator 函数的简化版,可以任意字符作为分隔符:

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 试图从用户的机器上嗅探信息很容易出错。用户因不设置位置信息而臭名昭著。找出有关用户的任何信息的最简单方法是解释您想知道的原因,然后让他们选择适当的值。
        猜你喜欢
        • 2011-12-06
        • 2013-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多