【问题标题】:Locale.getDefault() returns en alwaysLocale.getDefault() 总是返回 en
【发布时间】:2012-05-22 17:46:24
【问题描述】:

unix 机器上的服务器总是使用 en 作为默认语言环境。 以下是语言环境输出

 LANG=en_US
 LC_CTYPE="C"
 LC_NUMERIC="C"
 LC_TIME="C"
 LC_COLLATE="C"
 LC_MONETARY="C"
 LC_MESSAGES="C"
 LC_ALL=C

我只是不明白 LANG 是否设置正确,那么为什么服务器以 en locale 开头。

【问题讨论】:

    标签: java linux unix locale


    【解决方案1】:

    在 Linux/Unix/Mac 中,设置 LC_ALLLANG 可以控制 Java 程序的默认语言环境。在 Windows 中,区域设置是从控制面板的区域和语言选项下设置的。

    当 JVM 在 *nix 环境中启动时,它会这样做:

    • 在环境中扫描LC_ALL
    • 如果LC_ALL 不存在,请扫描环境中的LANG
    • 如果设置了 JVM 设置 user.language,请使用它来代替环境变量。
    • 如果什么都不设置,默认为en_US(相信这是最后的失败案例)

    在您的环境中,您将 LC_ALL 设置为 C,这只是 C 语言环境。这基本上是对不使用语言环境的传统回退。

    您可以根据自己的情况更改LC_ALL,然后重新启动JVM,您应该会获得java.util.Locale.getDefault() 的新值。

    例子:

    import java.util.Locale;
    
    public class LocaleTest {
       public static void main(String[] args) {
          System.out.println(Locale.getDefault());
       }
    }
    

    这里正在运行:

    > LC_ALL=en_UK java LocaleTest
    en_UK
    
    > LC_ALL=ja_JP java LocaleTest
    ja_JP
    

    另请注意,如果您运行的是 Java 1.7.0-b147,则 JRE 存在一个错误,即无法识别区域设置的环境设置,并且将始终使用默认系统区域设置。

    在这里报告错误:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7073906

    【讨论】:

    • 谢谢 birryree。但是 getDefault 方法根据 user.language 属性返回 Locale 。如果在运行像 -Duser.language=en_GB 这样的服务器时没有显式传递这些属性,那么如何设置这些值?这些属性是在用户登录系统时设置的还是jvm根据环境设置这些属性的。
    • @Delta - 正如我所提到的,它会查看您的本地环境并在 JVM 启动时使用 LC_ALLLANG 变量作为语言环境。如果没有设置,它将默认为某个硬编码值 (en_US)。
    • 谢谢 birreyree。我将进行此更改,看看它是否正常工作。我会及时通知您。谢谢
    • 谢谢。通过设置 LC_ALL 问题得到解决。
    猜你喜欢
    • 2019-01-09
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    相关资源
    最近更新 更多