`
rdman
  • 浏览: 84339 次
  • 性别: Icon_minigender_1
  • 来自: 陕西
社区版块
存档分类
最新评论

java调用perl出现编码问题

    博客分类:
  • perl
 
阅读更多
Java和Perl互相调用的编码问题
2010-01-08 15:55
在Java和Perl互相调用的程序中,涉及IO的部分一定要合理处理编码问题。
Windows系统中Java的默认编码是GBK,而Perl默认编码是UTF-8.所以如果不合理处理编码,在进程通信过程中,如果处理的是大字符集,则必然会出现乱码,下面是一套解决方案(分析基于Windows系统):

1. perl可以方便的处理编码,不仅可以在打开I/O描述符时设定I/O编码,而且可以随时更改,并且通过Perl还可以方便地进行编码转换:

PERL CODE
-------------------------------------
use encoding 'gbk';   # 系统默认编码为GBK
use open IN=>':encoding(utf16)';   # 读入文件时认为数据按UTF-16编码,自动根据BOM头判断
open(FH,"test.txt") or die;
while(<FH>) {   # 读入数据时自动从UTF-16转换为标准的UTF-8编码的Perl字符串
    chomp;
    print "$_\n";   # 由于encoding指定了系统默认编码,输出时数据自动从UTF-8转换为GBK
}

#也可以用open的3参数形式指定单个文件句柄的PerlIO层编码,并在输出时手工转换编码:
use Encode;   # 需要使用encode函数实现手工转码
open(FH,"<:encoding(utf16)","test.txt") or die;   # 指定FH句柄的数据为UTF-16编码
while(<FH>) {   # 读入数据同样自动转换为UTF-8
    chomp;
    print encode("gbk",$_),"\n";   # 手动将UTF-8编码字符串转换为GBK编码字符串输出
}

#另外使用binmode可以随时切换某个文件句柄的PerlIO层编码,如:
binmode(FH,":encoding(utf16)");   # 将FH的数据编码置为UTF-16
binmode(FH,":raw");   # 不对FH的数据进行编解码处理
binmode(FH,":utf8");   # 将FH的数据编码置为UTF-8
# [ 更多请参考perl manual ]

--------------------------------------

再使用Java调用Perl的时候可以通过如下方式让Perl的默认编码与Java相同,避免乱码的发生:
use Encode;
# set perl stdard iostream encoding
binmode(STDIN,":encoding(GBK)");
binmode(STDOUT,":encoding(GBK)");

2.Perl中编码转换:

PERL CODE
----------------------
use Encode;
$gb2312_string;
$utf8_string=decode("GB2312",$gb2312_string); #Perl默认编码为utf-8
$big5_string=encode("Big5",$utf8_string); #按Big5编码
----------------------

3.Java中编码的处理:

如果设定好了Perl的编码,那么Java的字符串只需要按默认编码GBK处理即可。
Java设定编码读取文件:
BufferedReader br = new BufferedReader(new InputStreamReader(
                    new FileInputStream(FILEPATH), ENCODING));
使用br.read() br.readLine()读取出来的字符串都会按Java默认编码GBK进行编码。
关于Java中编码探测和编码转换可以参考我的上一篇日志中给出的那几个网址中的相关工具进行处理,不再赘述。

注:
Linux系统中Java的默认编码为ISO-8859-1,为了使程序与平台无关,可以在编译的时候添加 encoding 参数。

参考网址:
http://chaoslawful.bokee.com/839877.html
http://www.ibm.com/developerworks/cn/java/java_chinese/
分享到:
评论

相关推荐

    java调用perl脚本并压缩zip

    这个教程就是关于如何使用Java调用Perl脚本来生成Excel文件,然后将生成的文件压缩为ZIP格式,同时解决可能出现的乱码问题。这里我们将深入探讨这两个关键步骤。 首先,让我们来看看Java调用Perl脚本的部分。在Java...

    为RobotFramework测试自动化工具开发EclipseIDE_Java_Perl_下载.zip

    - **使用Perl库**:同样,也可以编写Perl库,利用Perl的文本处理和系统操作能力,以适应特定的测试需求。 为了充分利用这些功能,开发者需要熟悉Java和Perl的编程,以及Robot Framework的关键字驱动测试方法。通过...

    谷歌眼镜的谷歌身份验证器_Java_Perl_下载.zip

    这个“谷歌眼镜的谷歌身份验证器_Java_Perl_下载.zip”文件可能包含了一个用于在谷歌眼镜上实现谷歌身份验证器功能的源代码或工具包,其中涉及到Java和Perl两种编程语言。 Java是广泛使用的跨平台编程语言,它在...

    URI:Escape模块,awstats搜索的关键字的乱码问题解决

    之所以搜索的关键字句会变成乱码的原因,主要是因为现在的搜索引擎都是使用UTF8,而Awstats是使用decodeUTFkeys这个plugin来处理搜索引擎的UTF8关键字,默认是没有打开的,所以在显示上会出现乱码。 要解决中文...

    Hprose Java 使用说明

    ### Hprose Java 使用说明详解 #### 一、Hprose简介与快速入门 **Hprose**(High Performance Remote Object Service Engine)是一款商用开源的轻量级跨语言跨平台的面向对象的高性能远程动态通信中间件。它支持...

    神奇的Perl-最佳Perl入门读物

    而"╔±╞µ╡─perl└²╫╙"这个名字看起来像是经过特殊编码或乱码的文件,可能是一个Perl程序或者数据文件,用于演示或练习Perl的编码和解码能力。"神奇的perl例子"则很可能是一系列展示Perl语言特性和应用的实例...

    eclipse perl 插件

    Eclipse 是一个著名的开源集成开发环境(IDE),广泛用于Java编程,但它也支持多种其他语言,包括Perl。Perl是一种功能强大的脚本语言,常用于文本处理、系统管理以及Web开发等任务。为了在Eclipse中方便地编写和...

    java开源包8

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包1

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包4

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包6

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包101

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包9

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包5

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包10

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    java开源包3

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    Java资源包01

    WebSocket4J 是一个用 Java 实现的 WebSocket 协议的类库,可使用 Java 来构建交互式 Web 应用。WebSocket4J 并未实现客户端通讯协议,所以不能用它来连接 WebSocket 服务器。 Struts验证码插件 JCaptcha4Struts2 ...

    JAVA外文文献+翻译.doc

    Java的出现解决了这个问题。Java是一种面向对象的编程语言,可以在客户机上运行小程序,称为Applet。Applet可以完成复杂的交互式任务,而不需要服务器的干预。Java Applet可以在客户机上执行,这样可以减少服务器的...

    JAVA上百实例源码以及开源项目源代码

    Java从网络取得文件 1个目标文件 简单 Java从压缩包中提取文件 1个目标文件 简单 Java存储与读取对象 1个目标文件 如题 Java调色板面板源代码 1个目标文件 摘要:Java源码,窗体界面,调色板 使用Java语言编写的一款...

    Eclipse 3.3 中文PERL插件

    Eclipse 是一款强大的集成开发环境(IDE),被广泛用于Java开发,但通过安装各种插件,它也可以支持其他编程语言,如Perl。在Eclipse 3.3版本中,开发者可以找到适合中文用户的PERL插件,以便在该平台上进行Perl程序...

Global site tag (gtag.js) - Google Analytics