perl - IO::Socket::INET 发送中的宽字符
问题描述
我正在尝试使用 IO::Socket::INET 发送一些文本,这是我的代码:
my $socket = new IO::Socket::INET(PeerAddr => $IP,
PeerPort => $Port,
Proto => 'udp',
Timeout => 1) or die 'Could not create socket: $!';
$socket->send($text) or die "Send UDP packet error: $!";
但是我发送的文本中有一些非 utf-8 字符,然后我收到这条消息,知道如何解决吗?
Wide character in send at C:/Strawberry/perl/lib/IO/Socket.pm
解决方案
套接字是字节流而不是字符流。这意味着您需要将字符串编码为字节。有多种可能的字符编码,但常用的一种是UTF-8,其中单个字符显示为 1 到 6 个字节(ASCII 等为 1 个字节)。
use Encode 'encode';
my $bytes = encode('UTF-8', $text);
$socket->send($bytes);
请注意,如果要从字节中取回字符,则需要在接收端执行相反的操作,即使用Encode::decode
.
另请参阅文档中的相关部分,特别是在perlunifaq中有关何时编码以及不编码会发生什么的部分。
推荐阅读
- wordpress - 更新 SSL 证书后,浏览器一直显示 SSL 错误
- lua - 如何使用 Lua 获取 timezone_offset(例如:UTC+05:30)
- android - Flutter CRON / TIMER / STATE 在 Android 上不起作用
- mysql - 查找用户购物车表中的所有产品并检查产品是否在已保存项目表中
- python - 一个程序,告诉我返回的项目的价值
- java - 为 JPA 创建通用实体模型
- java - Maven 执行器未检测到 AdoptOpenJDK-11
- chart.js - ChartJS 缩放粒度
- java - 如何将另一个类中的 JFilechooser 添加到不同类中的 JPanel?
- javascript - 如何从使用 ReactJS 上的 useState 钩子创建的状态变量创建静态变量?