[perl]Wide character in print报错

简介:

用perl写文本处理程序,或者写服务器端脚本的时候,常常会遇到“Wide character in print”的警告或者错误。

这是因为在程序中处理中文等宽字符时,perl不能识别要处理的内容。

首先要知道perl只能处理两种编码:ascii码和utf-8。ascii码是很少的,像中文、日文、韩文等字符要想能被perl处理,只能用utf-8编码方式。字符串在perl内部的存储格式如下图:

当flag是1的时候,perl就会把那个字符串当做utf-8编码的字符来处理;如果是0,perl就不能认知字符串中除了ascii码之外的字符,这个时候,就会报出“Wide character in print”的警告或者错误。

举个例子,你要在程序中处理‘当历史成为历史’这个字符串,如果你的程序文件是utf-8编码的话,一般情况下直接处理就行了,因为这 时字符串的utf8-flag是打开的。如果你的程序文件是gb2312的话,那么你就需要把那个字符串的utf8-flag打开。但是,一般还会有这样 的问题,因为这个字符串是gb2312编码的,所以你要做两件事情:将字符串的编码转为utf-8和打开utf8-flag。

use Encode;
use strict;

my $str = "当历史成为历史";
Encode::_utf8_on($str);
print $str. "\n";
Encode::_utf8_off($str);
print $str. "\n";
将上面的这段程序存到文件里,试图运行的时候就会报错:Wide character in print at test.pl line 6。这就是因为utf8-flag被关闭,perl不能识别字符串。

当然,在每个处理宽字符的地方加上Encode::_utf8_on函数确实是个解决办法。但是一般来说,在每个地方都加上这样的函数,既在编写程序的时候麻烦,维护的时候更麻烦。

这里还有一个更好的办法:在程序文件的头部加上以下内容

use utf8;
binmode(STDIN, ':encoding(utf8)');
binmode(STDOUT, ':encoding(utf8)');
binmode(STDERR, ':encoding(utf8)');


本文转自dongfang_09859 51CTO博客,原文链接:http://blog.51cto.com/hellosa/658867,如需转载请自行联系原作者

相关文章
|
存储 Kubernetes 算法
开源免费的对象存储Minio
Minio是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合存储大容量、非结构化的数据。例如,图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小的,从几KB到5TB不等。
2234 0
|
关系型数据库 MySQL 搜索推荐
mysql point类型的简单使用
什么是point类型数据?举个例子如下:POINT(123.462202 41.804471) 首先建立一个表: DROP TABLE IF EXISTS `tb_point`; CREATE TABLE `tb_point` ( `timesta...
3561 0
|
弹性计算 容灾 关系型数据库
阿里云服务器ECS中扩容云盘后磁盘容量没有增加的解决方法
ECS控制台操作扩容只是扩大云盘的存储容量,不会扩容ECS实例的文件系统。还需要登录实例,然后进行扩容文件系统的操作。
2250 0
阿里云服务器ECS中扩容云盘后磁盘容量没有增加的解决方法
|
Oracle Ubuntu 关系型数据库
Linux平台Oracle开机自启动设置
【11月更文挑战第7天】本文介绍了 Linux 系统中服务管理机制,并详细说明了如何在使用 systemd 和 System V 的系统上设置 Oracle 数据库的开机自启动。包括创建服务单元文件、编辑启动脚本、设置开机自启动和启动服务的具体步骤。最后建议重启系统验证设置是否成功。
405 1
|
SQL 数据管理 API
数据管理DMS产品使用合集之阿里云DMS提供API接口来进行数据导出功能吗
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
|
消息中间件 监控 Kafka
深入解析:Kafka 为何不支持全面读写分离?
**Kafka 2.4 引入了有限的读写分离,允许Follower处理只读请求,以缓解Leader压力。但这不适用于所有场景,特别是实时数据流和日志分析,因高一致性需求及PULL同步方式导致的复制延迟,可能影响数据实时性和一致性。在设计系统时需考虑具体业务需求。**
237 1
|
存储 Perl
sed处理多行模式(如括号匹配)
sed处理多行模式(如括号匹配)
1375 2
|
消息中间件 Kubernetes API
Kubernetes: Job 和 CronJob 的实现原理
Kubernetes: Job 和 CronJob 的实现原理
Kubernetes: Job 和 CronJob 的实现原理
|
网络协议 前端开发 关系型数据库
OceanBase数据库在启动过程中出现了一些问题
OceanBase数据库在启动过程中出现了一些问题
443 1
|
SQL 存储 关系型数据库
MySQL8.0之执行计划
MySQL8.0.17 执行计划
2825 0