如何从OS Java中读“列表分隔符”?

问题描述 投票:8回答:7

我用Java编写一个CSV出口国应该尊重用户的自定义设置,尤其是“列表分隔符”作为分隔符使用。

在Windows中,一个可在此列表分隔符

Control Panel -> Regional and Language Options -> Regional Options -> Customize

我不知道其他操作系统,但我敢肯定,你可以改变其他操作系统了。

什么是获得从OS到Java这个自定义设置的最佳方式?我在一个Eclipse RCP的环境,因此,如果有可用的东西,我可能会使用RCP相关的解决方案。

java csv operating-system regional list-separator
7个回答
6
投票

this answer的评论:

读取操作系统特定的设置需要我见面。

因此,如果操作系统Windows以外没有什么这样的设置?

我建议你从Windows上的注册表读取它(如提及here):Read/write to Windows Registry using Java。在其他平台上只使用一个很好的默认,也许,至少在Unix上,还支持通过自定义环境变量配置它(你记录良好):How can my java code read OS environment variables?

我的感觉:操作系统普遍没有一个(系统范围或用户特定)“列表分隔符”设置可能是错误的,当然,但我对此表示怀疑。


6
投票

不用借助平台具体的解决方案,我认为,要采取最好的办法将是允许用户在自己的应用程序中指定的列表分隔的偏好。无论是在偏好面板,上出口或通过可选的命令行参数的对话框。


5
投票

除了在您的应用程序提供自己的选项,用户可以尝试猜列表分隔符是什么。

我看了一下Windows中的某些区域设置,看到该列表分隔符为“;”要么 ”,”。我听说是在一些不起眼的区域设置另一个角色,但还没有看到它自己。所以,如果你可以让你的代码来处理这两个“;”和“”作为列表分隔符,那么你可能会覆盖大多数情况下。

此外,它看起来的时候“”作为小数点分隔符,然后像“”永远不会用作列表分隔符。我想这是否则号码将不可能在一个列表,以识别:1,2,3,4可以是1.2,3.4或1,2.3在这些情况下“;”用作列表分隔符。不幸的是,反之则不然。阿拉伯语有“”为十进制符号和“;”作为列表分隔符。

所以,我认为可以安全地遵循合理的规则是:

if (decimalSeparator == ',') 
    then listSeparator = ';'
else if (decimalSeparator == '.') 
    then listSeparator = new char[] {';', ','}

2
投票

出于好奇,我搜索了一下话题,确实Java的好像还没有这样的想法开箱。

Locales Demo给人的区域设置了比较完善的上市并没有列表分隔那里。

我看到一个forum question指sun.text.resources包,这是私人和过时。你不会找到其他多引用这个包,看起来像是生活在JRE / lib / ext目录/ localedata.jar虽然我最近的这一个副本列出主要亚洲语言环境。

以上建议是合理的,否则你可能会研究和利用每个区域设置一个私有列表。我将在IBM的ICU库(C语言,我认为)这似乎有区域设置一个相当大名单也许看。据a remark,ICU本身会从一个ISO标准,应研究作为主要的信息提供者的信息。


1
投票

我面临着同样的问题,也发现了唯一正确的解决方案是提供了一种用户指定的“首选分隔符”。

但是,如果这是不可能的,因为它是在我的情况下,最接近我能得到跨洗车台,跨语言环境支持如下:

  • 猜你需要使用的DecimalFormatSymbols使用分离器
  • 在包含CSV的开始添加一行,例如“SEP =”(不带引号),这应该说明你刚刚猜到列表分隔

这将至少在大多数情况下,(我已经测试过的情况下),强制Excel使用的分隔符,即使你“猜错了”,并会提供至少多一点点的兼容性。


1
投票

嗯,我认为这是一个严肃的话题!

事情是,在Windows中,有Excel中。和许多程序都与它进行交互。 Excel使用列表分隔区域(细胞分离)。

最根本的问题是,“逗号分隔值”不美国以外(西班牙语(USA))和英语的工作,因为你不能有相同的列表分隔符作为小数点分隔符。所以美国以外和英语世界(包括美国军明(应)遵守北约的语言环境中,小数逗号等和ISO措施)使用;作为列表分隔在电子表格中分离细胞,不与小数逗号混淆了。

因此,在一般情况下,列表分隔的区域设置的Windows设置是除英语或美国,其中列表分隔符是; ,

Excel有它的美/英CSV不便,特别是;在默认的美国和英国设置相同的字符,是千个分隔符和擅长去坚果(细胞被拧导入CSV的与它使用)。跳过千个分隔符(当它是一样的列表分隔符)的Excel不承认货币细胞,并把它们作为文本。东西,我们还住在美国和英国的环境,否则世界各地的正常工作(与;)。

有趣的事情(有趣的想法)是运行Java在Windows支持的NDK的Win32库的访问?因为在Win32中你打电话

GetLocaleInfoEx(LOCALE_NAME_USER_DEFAULT, LOCALE_SLIST, pwListSeparator, 4); 

我无法找到一个Java解决方案得到一个列表分隔符?

我的建议是使用硬编码的一般规则,设置列表分隔符;时小数点分隔符是,,否则设置列表分隔到,如果另一个字符不能在现场方法或设置,如在Win32中被发现。删除(不使用),千个分隔符,如果他们是相同的列表分隔符。

或者使用标签的文本文件?唯一不方便的是,Windows默认的Excel的.csv文件和记事本上使用的ShellExecute(0,0,pwFileName,0,0,SW_SHOW).txt的文件打开;.

引人注目的是,小数点分隔符和千个分隔符在Java中存在,我想应该用:

import java.text.DecimalFormatSymbols;
new DecimalFormatSymbols().getDecimalSeparator();
new DecimalFormatSymbols().getGroupingSeparator();

-1
投票

对于Windows它存储在注册表中的位置:

"HKEY_CURRENT_USER\\Control Panel\\International"

所以你可以使用这样的事情

private void setDelimiterProperties(String delimiter) {
    Properties p = new Properties();
    String key = "HKEY_CURRENT_USER\\Control Panel\\International\\sList";
    p.setProperty(key, delimiter);
}
© www.soinside.com 2019 - 2024. All rights reserved.