Java中的locale设定

来源:互联网 发布:复变函数 知乎 编辑:程序博客网 时间:2024/04/29 21:54

locale错误导致Java中文乱码错误的总结

标签:locale错误java| 发表时间:2014-12-02 12:57 | 作者:brandNewUser
分享到:
出处:http://www.iteye.com
线上执行MapReduce任务计算时,经过排查发现了某些服务器计算的数据出现中文乱码问题,但是服务器的配置是完全一致的。由于我们使用的key可能包含中文,中文乱码问题体现在每次合并map记录的时候计算数据的随机性,每次执行的结果都不一样(由于Map任务执分配的随机性)。
(注:此文章大部分都参考了同事查找到的问题解决方法。)
 
在执行Java进程的过程中,通过命令:jinfo+Java进程号 可以查看java进程运行的一些环境信息,其中也包括-D设置的相关参数。
 
截取的所有信息中,我们比较感兴趣的是下面两行配置:
file.encoding = ANSI_X3.4-1968sun.jnu.encoding = ANSI_X3.4-1968
 
 
而其他DataNode上MR进程的相关配置,按照常理来说,这个错误是不应该发生的。
sun.jnu.encoding = UTF-8file.encoding = UTF-8
 
 
考虑到出问题的那台机器在某天重启过,定位在某次重启时执行的环境问题。执行
 
  • 如果将这台服务器下线,任务执行成功;
  • 如果将任务全部加上对于这里面的两个属性,就会肯定成功,因为此时已经被改变:
java -Dsun.jnu.encoding=UTF-8 -Dfile.encoding=UTF-8 ${mainClass}

 

 
参考了下面一篇文章协助解决这个问题:
http://happygiraffe.net/blog/2009/09/24/java-platform-encoding/
 
临时的解决方案,或者将这台服务器执行下线操作,或者将整个集群的mapreduce.admin.map(reduce).child.java.opts设置上加入这两个参数,保证后续所有的MR任务都使用这两个参数。
 
那么问题始终是要找到原因的,于是马上补充一下关于locale的相关知识,下面ubuntu wiki上的内容算是说的比较全面的:
http://wiki.ubuntu.org.cn/Locale
 
执行locale命令,可以得出所有的locale信息(本机的环境并没有问题,ssh到服务器上执行出来的结果也正确):
LANG="zh_CN.UTF-8"LC_COLLATE="zh_CN.UTF-8"LC_CTYPE="zh_CN.UTF-8"LC_MESSAGES="zh_CN.UTF-8"LC_MONETARY="zh_CN.UTF-8"LC_NUMERIC="zh_CN.UTF-8"LC_TIME="zh_CN.UTF-8"LC_ALL=
 
 
按照wiki的说明,总共分为12个大类:
  • 语言符号及其分类(LC_CTYPE)
  • 数字(LC_NUMERIC)
  • 比较和排序习惯(LC_COLLATE)
  • 时间显示格式(LC_TIME)
  • 货币单位(LC_MONETARY)
  • 信息主要是提示信息,错误信息, 状态信息, 标题, 标签, 按钮和菜单等(LC_MESSAGES)
  • 姓名书写方式(LC_NAME)
  • 地址书写方式(LC_ADDRESS)
  • 电话号码书写方式(LC_TELEPHONE)
  • 度量衡表达方式(LC_MEASUREMENT)
  • 默认纸张尺寸大小(LC_PAPER)
  • 对locale自身包含信息的概述(LC_IDENTIFICATION)。
 
其中的设置又分为相应的优先级,LC_ALL>LC_*>LANG,LC_ALL是最上级设定或者强制设定,而LANG是默认设定值,当前集群中的所有服务器都没有进行这些参数的手动设置。
 
经过检查,发现mac的字符集确实与其他的有所不同,具体可以参考下面这篇文章:
http://blog.shlrm.org/blog/2012/10/04/osx-java-utf-8-oh-my/
 
其中说到了:
“Mac OSX uses a special kind of decomposed UTF-8 to store filenames. If you need to read in filenames and write them to a ‘normal’ UTF-8 file, you must normalize them. My understanding of this is that when you pass a name with an accented character like é, it will decompose this into e plus ’ before saving it to the filesystem (this behavior is defined by the Unicode standard).”
 
 
我们的远程服务器并没有显示地指定LC_*参数,那么就会出现本机登陆的相关locale信息被带到远程服务器上。由于Mac中如果没有设置默认则为:
LC_CTYPE=UTF-8
 
 
这个参数会被带到相关的服务器节点中,服务器的操作系统为CentOS,而在CentOS中并没有UTF-8这个值,可以被设置为zh_CN.UTF-8或者en_US.UTF-8这两种类型,而Mac上的UTF-8是无效的。
 
而Java虚拟机在启动的时候,会根据LC_CTYPE来决定sun.jnu.encoding和file.encoding的设置,由于Mac带过来的设置是非法的,导致这两个值被设置成:ANSI_X3.4-1968,这也是其他两个mac用户亲身实践得到的经验(Mac用户的优越感造就了一个大坑…),哈哈。
 
最后,通过手动改变服务器启动加载的配置文件/etc/profile,强制显示地设置locale参数来Fix这个问题,这也是比较推荐的方式(相对于改变java参数来说)。
export LANG=en_US.UTF-8export LC_CTYPE=en_US.UTF-8export LC_NUMERIC=en_US.UTF-8export LC_TIME=en_US.UTF-8export LC_COLLATE=en_US.UTF-8export LC_MONETARY=en_US.UTF-8export LC_MESSAGES=en_US.UTF-8export LC_PAPER=en_US.UTF-8export LC_NAME=en_US.UTF-8export LC_ADDRESS=en_US.UTF-8export LC_TELEPHONE=en_US.UTF-8export LC_MEASUREMENT=en_US.UTF-8export LC_IDENTIFICATION=en_US.UTF-8export LC_ALL=en_US.UTF-8
 
 
 


已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐
  • —软件人才免语言低担保 赴美带薪读研!—



相关 [locale 错误 java] 推荐:

locale错误导致Java中文乱码错误的总结

- - Java - 编程语言 - ITeye博客
线上执行MapReduce任务计算时,经过排查发现了某些服务器计算的数据出现中文乱码问题,但是服务器的配置是完全一致的. 由于我们使用的key可能包含中文,中文乱码问题体现在每次合并map记录的时候计算数据的随机性,每次执行的结果都不一样(由于Map任务执分配的随机性). (注:此文章大部分都参考了同事查找到的问题解决方法. 在执行Java进程的过程中,通过命令:jinfo+Java进程号 可以查看java进程运行的一些环境信息,其中也包括-D设置的相关参数. 截取的所有信息中,我们比较感兴趣的是下面两行配置:. 而其他DataNode上MR进程的相关配置,按照常理来说,这个错误是不应该发生的.

Java开发者易犯错误Top10

- - CSDN博客编程语言推荐文章
摘要:在Java中,有些事物如果不了解的话,很容易就会用错,如数组转换为数组列表、元素删除、Hashtable和HashMap、ArrayList和LinkedList、Super和Sub构造函数等,如果这些对你来说是陌生的,你可以在本文中了解它们. 本文总结了Java开发者经常会犯的前十种错误列表. 将数组转换为数组列表,开发者经常会这样做:. Arrays.asList()将返回一个数组内部是私有静态类的ArrayList,这不是java.util.ArrayList类,java.util.Arrays.ArrayList类有set()、 get()、 contains()方法,但是没有任何加元素的方法,因此它的大小是固定的.

Java 程序员容易犯的10个SQL错误

- - ITeye博客
Java程序员编程时需要混合面向对象思维和一般命令式编程的方法,能否完美的将两者结合起来完全得依靠编程人员的水准:. 技能(任何人都能容易学会命令式编程). 模式(有些人用“模式-模式”,举个例子,模式可以应用到任何地方,而且都可以归为某一类模式). 心境(首先,要写个好的面向对象程序是比命令式程序难的多,你得花费一些功夫). 但当Java程序员写SQL语句时,一切都不一样了. SQL是说明性语言而非面向对象或是命令式编程语言. 在SQL中要写个查询语句是很简单的. 但在Java里类似的语句却不容易,因为程序员不仅要反复考虑编程范式,而且也要考虑算法的问题. 下面是Java程序员在写SQL时常犯的错误(没有特定的顺序):.

Java 8中10个不易察觉的错误

- - Java译站
我敢打赌,每人至少都会犯一次这样的错误. 就像现有的这些“流”(比如说InputStream),你也只能对它们消费一次. 你会碰到一个这样的错误:. 因此使用流的时候应当格外注意. 不小心创建了一个”无限"流. 你可能一不留神就创建了一个无限流. 流的问题就在于它有可能是无限的,如果你的确是这样设计的话. 唯一的问题就是,这并不是你真正想要的. 因此,你得确保每次都给流提供一个适当的大小限制:. 不小心创建了一个“隐藏的”无限流. 你可能一不小心就真的创建了一个无限流. 我们生成了0和1的交替数列. 然后只保留不同的数值,比如说,一个0和一个1. 然后再将流的大小限制为10. 好吧,这个distinct()操作它并不知道iterate()所调用的这个函数生成的只有两个不同的值.

Java开发者写SQL时常犯的10个错误

- - ImportNew
我十分惊讶的发现,我最近的一篇文章——《 Java开发者写SQL时常犯的10个错误》——最近在 我的博客和 我的合作伙伴DZone上非常的受欢迎. (这篇博客)的流行程度说明了几件事:. SQL在专业的Java开发中多么重要. 基本的SQL知识被忘掉(的情况)普遍存在. 通过 embracing SQL,你就能了解像. jOOQ或 MyBatis这样的以SQL为中心的库正好反应了市场的需要.  令人惊喜的是有用户提到了我博客上贴的一篇“ SLICK’s mailing list”,SLICK是Scala中的一个不以SQL为中心的数据库访问库,像LINQ(还有LINQ-to-SQL),它侧重语言整合,而不是SQL语句的产生.

Pal Locale:使网上租人成为可能

- hailin - 36氪
科技网站The Next Web的总裁兼CEO Mike Podhorzer表示他将推出一个新的网站Pal Locale,他对这个网站的定位是“按小时租人的社区平台”. 很多人可能独自在外出差期间不想一个人吃饭,在这种情况下,他们就可以在Pal Locale上租一个能与自己一起用餐的人,并且按小时支付给对方一定的酬报. 还有一种情况是,对于那些刚搬去一个人生地不熟的环境的人来说,他们可以在Pal Locale上租一个当地人来帮助自己熟悉当地的环境等. 用户不仅可以在Pal Locale租人,同时也可以在Pal Locale上将自己租出去. 目前,Pal Locale的网页只允许用户递交自己的邮件地址,等网站正式运营时会通知这些用户.

Java中的锁(Locks in Java)

- - 并发编程网 - ifeve.com
原文链接 作者:Jakob Jenkov 译者:申章 校对:丁一. 锁像synchronized同步块一样,是一种线程同步机制,但比Java中的synchronized同步块更复杂. 因为锁(以及其它更高级的线程同步机制)是由synchronized同步块的方式实现的,所以我们还不能完全摆脱synchronized关键字( 译者注:这说的是Java 5之前的情况). 自Java 5开始,java.util.concurrent.locks包中包含了一些锁的实现,因此你不用去实现自己的锁了. 但是你仍然需要去了解怎样使用这些锁,且了解这些实现背后的理论也是很有用处的. 可以参考我对 java.util.concurrent.locks.Lock的介绍,以了解更多关于锁的信息.

Java PaaS 对决

- 呆瓜 - IBM developerWorks 中国 : 文档库
本文为 Java 开发人员比较了三种主要的 Platform as a Service (PaaS) 产品:Google App Engine for Java、Amazon Elastic Beanstalk 和 CloudBees RUN@Cloud. 它分析了每种服务独特的技术方法、优点以及缺点,而且还讨论了常见的解决方法. 学习基础 Java PaaS 的基本概念并了解如何选择适用于您开发的服务.

Java浮点数

- d0ngd0ng - 译言-电脑/网络/数码科技
Thomas Wang, 2000年3月. Java浮点数的定义大体上遵守了二进制浮点运算标准(即IEEE 754标准). IEEE 754标准提供了浮点数无穷,负无穷,负零和非数字(Not a number,简称NaN)的定义. 在Java开发方面,这些东西经常被多数程序员混淆. 在本文中,我们将讨论计算这些特殊的浮点数相关的结果. 我们也将指出一些通常的Java浮点数的陷阱. 在Java编程语言中提供了两种内置的表示浮点数的类别:float和double. float占用4字节的存储空间,有23位用来表示精度;double占用8字节的存储空间,有52位用来表示精度. 3.0d是个双精度浮点数常量.

Qt——转战Java?

- - 博客 - 伯乐在线
编者按:事实上,在跨平台开发方面,Qt仍是最好的工具之一,无可厚非,但Qt目前没有得到任何主流移动操作系统的正式支持. 诺基亚的未来计划,定位非常模糊,这也是令很多第三方开发者感到失望,因此将导致诺基亚屡遭失败的原因. Qt的主要开发者之一Mirko Boehm在博客上强烈讽刺Nokia裁了Qt部门的决定,称其为“绝望之举”,而非“策略变更”. 后又传,RIM向被裁Qt开发者们伸出橄榄枝. 既然nokia已停止Meltemi系统开发,现如今Qt部门又被解散,那么基于此的MeeGo系统也必将终结. nokia下一战略会不会将基于Java. 张玉胜表示,nokia如果基于Java,其实只是换了一种死法,下一个战略说得不好听就是面向穷人的夕阳战略,做为开发者从数据上看,舍不到花钱买好手机的人决决大多数不会付费买应用的.
0 0
原创粉丝点击