perl 中文处理技巧_应用技巧

Perl从5.6开始已经开始在内部使用utf8编码来表示字符,也就是说对中文以及其他语言字符的处理应该是完全没有问题的。我们只需要利用好Encode这个模块便能充分发挥Perl的utf8字符的优势了。

下面就以中文文本的处理为例进行说明,比如有一个字符串"测试文本",我们想要把这个中文字符串拆成单个字符,可以这样写:

use Encode;
$dat="测试文本";
$str=decode("gb2312",$dat);
@chars=split //,$str;
foreach $char (@chars) {
print encode("gb2312",$char),"\n";
}

结果大家试一试就知道了,应该是令人满意的。

这里主要用到了Encode模块的decode、encode函数。要了解这两个函数的作用我们需要清楚几个概念:

1、Perl字符串是使用utf8编码的,它由Unicode字符组成而不是单个字节,每个utf8编码的Unicode字符占1~4个字节(变长)。

2、进入或离开Perl处理环境(比如输出到屏幕、读入和保存文件等等)时不是直接使用Perl字符串,而需要把Perl字符串转换成字节流,转换过程中使用何种编码方式完全取决于你(或者由Perl代劳)。一旦Perl字符串向字节流的编码完成,字符的概念就不存在了,变成了纯粹的字节组合,如何解释这些组合则是你自己的工作。

我们可以看出如果想要Perl按照我们的字符概念来对待文本,文本数据就需要一直用Perl字符串的形式存放。但是我们平时写出的每个字符一般都被作为纯ASCII字符保存(包括在程序中明文写出的字符串),也就是字节流的形式,这里就需要encode和decode函数的帮助了。

encode函数顾名思义是用来编码Perl字符串的。它将Perl字符串中的字符用指定的编码格式编码,最终转化为字节流的形式,因此和Perl处理环境之外的事物打交道经常需要它。其格式很简单:
$octets = encode(ENCODING, $string [, CHECK])

$string:  Perl字符串
encoding: 是给定的编码方式
$octets:  是编码之后的字节流
check:   表示转换时如何处理畸变字符(也就是Perl认不出来的字符)。一般不需使用

编码方式视语言环境的不同有很大变化,默认可以识别utf8、ascii、ascii-ctrl、
iso-8859-1等。

decode函数则是用来解码字节流的。它按照你给出的编码格式解释给定的字节流,将其转化为使用utf8编码的Perl字符串,一般来说从终端或者文件取得的文本数据都应该用decode转换为Perl字符串的形式。它的格式为:

$string = decode(ENCODING, $octets [, CHECK])
$string、ENCODING、$octets和CHECK的含义同上。

现在就很容易理解上面写的那段程序了。因为字符串是用明文写出的,存放的时候已经是字节流形式,丧失了本来的意义,所以首先就要用 decode函数将其转换为Perl字符串,由于汉字一般都用gb2312格式编码,这里decode也要使用gb2312编码格式。转换完成后Perl 对待字符的行为就和我们一样了,平时对字符串进行操作的函数基本上都能正确对字符进行处理,除了那些本来就把字符串当成一堆字节的函数(如vec、 pack、unpack等)。于是split就能把字符串切成单个字符了。最后由于在输出的时候不能直接使用utf8编码的字符串,还需要将切割后的字符用encode函数编码为gb2312格式的字节流,再用print输出。

时间: 2024-09-16 06:32:14

perl 中文处理技巧_应用技巧的相关文章

asp检测是否为中文字符函数_应用技巧

<% '****************************** '函数:CheckChinese(strng) '参数:strng,待验证字符 '描述:检测是否为中文字符,返回值:中文为true,否则false '示例:<%=CheckChinese(strng)%> '****************************** Function CheckChinese(strng) CheckChinese = true Dim regEx, Match Set regEx

js与ASP.NET 中文乱码问题_实用技巧

1. 客户端 -> 服务端的问题 1.1. get 方式提交短数据效率比 post 方式高 原因:个人感觉 1.2. post 方式提交时,若数据中含有中文,则服务端获得的数据中文部分会变为乱码 原因: 可能是提交时 XMLHttpRequest 自动对非标准 ASCII 字符进行了编码. 可能只是简单的逸码转换,但具体编码方式不详, 在服务端就很难还原. 解决:(a) 在客户端提交前,对串中的非标准 ASCII 字符用 escape() 手动转码. 这种方法对非标码位置比较有规律(比如存放在不

几款开源的中文分词系统_相关技巧

以下介绍4款开源中文分词系统. 1.ICTCLAS – 全球最受欢迎的汉语分词系统         中文词法分析是中文信息处理的基础与关键.中国科学院计算技术研究所在多年研究工作积累的基础上,研制出了汉语词法分析系统ICTCLAS(Institute of Computing Technology, Chinese Lexical Analysis System),主要功能包括中文分词:词性标注:命名实体识别:新词识别:同时支持用户词典:支持繁体中文:支持GBK.UTF-8.UTF-7.UNIC

ASP 判断是否有中文的代码_应用技巧

在 ASP(VBScript 为语言)中,Asc 函数的返回值小于 0 的,可以被判断为中文字符.Asc 函数返回与字符串的第一个字母对应的 ANSI 字符代码. 复制代码 代码如下: '判断字符串中是否有中文字符 '有-返回 true '无-返回 false '这里的中文字符可能还包括日文.韩文等东方文字 function HasChinese(str) HasChinese = false dim i for i=1 to Len(str) if Asc(Mid(str,i,1)) < 0

relaxlife.net发布一个自己开发的中文分词程序_实用技巧

近来因为工作原来,研究了一下中文分词,也就写了一个中文分词的程序.采用的是逆向最大匹配算算法. 使用示例: <%@ Page Language="C#"%> <%@ Import Namespace="Relaxlife.Xiaokui" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/

asp.net判断字符串是否是中文的方法_实用技巧

任何字符在unicode编码中都占用两个字节.而在一般编码方式中英文字符可以用一个字节表示,中文要用两个.这样英文字符在unicode编码中多占用了一个没有用的字节,这个没用字节就用0代替.如果unicode编码中字符的第一个字节是0那他就是英文字符.不是0他就可能是除了英文字符之外的很多种语言的文字,不仅仅是中文. 复制代码 代码如下: View Code public bool CheckChinese(string str)        {            bool flag =

Perl文件句柄详解_应用技巧

在文件I/O中,要从一个文件读取数据,应用程序首先要调用操作系统函数并传送文件名,并选一个到该文件的路径来打开文件.该函数取回一个顺序号,即Perl文件句柄(filehandle),该Perl文件句柄对于打开的文件是唯一的识别依据.要从文件中读取一块数据,应用程序需要调用函数ReadFile,并将Perl文件句柄在内存中的地址和要拷贝的字节数传送给操作系统.当完成任务后,在通过调用系统函数来关闭该文件. 除了你模仿唯我论者哲学家编写一个人工智能程序,你的程序使用不和外界通讯的方法.在班级例子中的

构造函数中Perl方法用法介绍_应用技巧

Perl语言中Perl方法的概念你是否了解,这里向大家简单介绍一下,Perl类的Perl方法只不过是一个Perl子程序而已,也即通常所说的成员函数. Perl方法 一.Perl方法简介 Perl类的Perl方法只不过是一个Perl子程序而已,也即通常所说的成员函数.Perl方法定义不提供任何特殊语法,但规定Perl方法的第一个参数为对象或其被引用的包.Perl有两种Perl方法:静态Perl方法和虚Perl方法.静态Perl方法第一个参数为类名,虚Perl方法第一个参数为对象的引用.Perl方法

silverlight2.0Beta版TextBox输入中文解决方法_实用技巧

新写一个TextBoxEx控件,继承于TextBox,并对TextBox的选择事件及字符改变事件做处理,以下是原代码 复制代码 代码如下: /************************************************************************/ /* 作者:覃小春 时间:20080826 说明:解决silverlightBeta2中TextBox中文输入问题 * blog:blog.csdn.net/colijian */ /*************