在 Perl 中将 UTF8 字符串转换为 ASCII

2024-03-10

我已经尝试了 Google 和 StackOverflow 推荐的(我能找到的)所有内容,包括使用 Encode。我的代码可以工作,但它只使用 UTF8,并且我收到宽字符警告。我知道如何解决这些警告,但我没有将 UTF8 用于其他任何用途,因此我只想转换它,而不必调整其余代码来处理它。这是我的代码:

my $xml = XMLin($content);
# Populate the @titles array with each item title.
my @titles;
for my $item (@{$xml->{channel}->{item}}) {
    my $title = Encode::decode_utf8($item->{title});
    #my $title = $item->{title};
    #utf8::downgrade($title, 1);
    Encode::from_to($title, 'utf8', 'iso-8859-1');
    push @titles, $title;
}
return @titles;

评论出来你可以看到我尝试过的其他一些东西。我很清楚我不知道自己在这里做什么。不过,我只想得到一个普通的旧 ASCII 字符串。任何想法将不胜感激。谢谢。


答案取决于您想如何使用标题。有 3 种基本方法可供选择:

  • 表示 UTF-8 编码字符串的字节。

如果您想要将 UTF-8 编码的字符串存储在应用程序之外(无论是存储在磁盘上还是通过网络发送或任何超出程序范围的内容),则应使用这种格式。

  • 一串 Unicode 字符。

字符的概念是 Perl 内部的。当你表演时Encode::decode_utf8,然后尝试将一堆字节转换为字符串,如 Perl 所示。 Perl VM(以及编写 Perl 代码的程序员)无法具体化该概念,除非在输入上解码 UTF-8 字节并在输出上将它们编码为 UTF-8 字节。例如,您的程序接收两个字节作为输入,您知道它们代表 UTF-8 编码的字符,比方说0xC3 0xB6。在这种情况下decode_utf8返回一种表示形式,该表示形式不是两个字节,而是一个字符:ö.

然后您可以继续在 Perl 中操作该字符串。为了进一步说明差异,请考虑以下代码:

my $bytes = "\xC3\xB6";
say length($bytes); # prints "2"
my $string = decode_utf8($bytes);
say length($string); # prints "1"
  • ASCII 的特殊情况,是 UTF-8 的子集。

    ASCII 是 Unicode 的一个非常小的子集,其中该范围内的字符由单个字节表示。将 Unicode 转换为 ASCII 本质上是一种有损操作,因为大多数 Unicode 字符都不是 ASCII 字符。当尝试强制 Unicode 时,您要么被迫删除字符串中非 ASCII 的每个字符,要么尝试从 Unicode 字符映射到其最接近的 ASCII 等效项(这在绝大多数情况下是不可能的)字符串转 ASCII。

由于您有宽字符警告,这意味着您正在尝试操作(可能输出)无法表示为 ASCII 或 ISO-8859-1 的 Unicode 字符。

如果您不需要将 XML 文档中的标题作为字符串进行操作,我建议您将其保留为 UTF-8 字节(我会提到您应该小心,不要在字符串中混合字节和字符)。如果您确实需要操作它,请解码、操作并在输出时以 UTF-8 对其进行编码。

如需进一步阅读,请使用perldoc学习perlunitut http://perldoc.perl.org/perlunitut.html, perlunifaq http://perldoc.perl.org/perlunifaq.html, perlunicode http://perldoc.perl.org/perlunicode.html, perluniintro http://perldoc.perl.org/perluniintro.html, and Encode https://metacpan.org/pod/Encode.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Perl 中将 UTF8 字符串转换为 ASCII 的相关文章

  • 从 django 返回带有 BOM 的 UTF-8 编码的 csv

    我正在尝试输出一个用户可以用 Excel 打开的 CSV 文件 我已经用 UTF 8 编码了所有字符串 但是当我用 Excel 打开文件时 我看到了乱码 只有在将文件转换为带 BOM 的 UTF 8 在 Windows 上使用 notepa
  • 哪一个代表null? undef 或空字符串

    我想插入null在表的一列中 哪一个代表null undef或空字符串 应该使用哪一种 为什么 我知道关于defined我可以检查一下 但我更多的是从数据库的角度来看 代表哪一个null更合适吗 Update 我在用DBI module D
  • perl imap 将邮件移至垃圾箱 (Mail::IMAPClient)

    我需要将所有未见的邮件移至垃圾箱 然后从收件箱中删除 my inbox imap gt select Inbox my mails imap gt unseen foreach my msgid mails imap gt set flag
  • 如何拆分一行并重新排列其元素?

    我在一行中有一些数据 如下所示 abc edf xyz rfg yeg udh 我想呈现如下数据 abc xyz yeg edf rfg udh 以便打印备用字段并用换行符分隔 有没有这样的衬里 下列awk脚本可以做到这一点 gt echo
  • perl xs - 从 c 数组返回 perl 数组

    使用 XS 我尝试将值从 C 数组传递到可在脚本中使用的 Perl 数组 这是我的 xs 文件中的代码 AV DoubleArray getPerlArray CODE r newAV for size t i 0 i lt THIS gt
  • ASCIIEncoding.ASCII.GetBytes() 返回意外值

    这段 C 代码 string s u00C0 byte bytes ASCIIEncoding ASCII GetBytes s Trace WriteLine BitConverter ToString bytes 产生以下输出 3F 为
  • 使用 Perl 计算字符串中的连续字符数

    我有一个包含多个连续字符序列的字符串 例如 aaabbcccdddd 我想将其表示为 a3b2c3d4 到目前为止 我已经想出了这个 usr bin perl str aaabbcccdddd str s 1 1 g print str n
  • 多个与单个 Catalyst 应用程序

    我有多个作为 FCGI 运行的 Catalyst 应用程序 将它们整合为具有多个控制器的单个控制器是否有好处 Thanks Simone 内存 大概吧 我认为每台服务器至少要保留 15MB 左右 因此如果您在 3 台服务器上运行 3 个应用
  • CPAN shell 内存不足。在 Unix 上如何给它更多的内存?

    我得到一个Out of memory 所有安装的消息 我以前从未使用过 cpan 并且不太确定它是如何工作的 我做了一个ulimit在 cpan 目录中 结果是无限的 这是我正在看的内容 usr bin perl MCPAN e shell
  • 从日志尾部提取匹配行后退出

    我使用范围运算符来提取日志文件的一部分 例如 tail F logfile perl ne print if b d 现在 一旦提取的部分匹配 我就尝试退出该过程 我尝试过 tail F logfile perl ne print if b
  • 使用 iconv 将 UTF-16BE 转换为无 BOM 的 UTF-8

    我正在尝试使用 iconv 将 UTF 16BE 编码文件 字节顺序标记 0xFE 0xFF 转换为 UTF 8 如下所示 iconv f UTF 16BE t UTF 8 myfile txt 然而 生成的输出具有 UTF 8 字节顺序标
  • 将参数传递给调试器中的 perl 文件并在系统执行的文件中设置断点

    因此 我使用 perl d file pl 在 perl 调试器中运行一个文件 但 file pl 也应该接受参数 如何向 file pl 提供参数 还有一个问题 file pl 中有这一行 system file2 pl 如果 file2
  • Bash - 在 perl 正则表达式中使用变量以及匹配组

    这是我在 stackoverflow 上的第一篇文章 如果我错过了一些重要的内容 请原谅我 我目前遇到以下问题 目标是根据我准备的文件列表动态替换端口号find 这些文件中的所有端口均以数字 4 开头 有 5 位数字 现在是棘手的部分 我只
  • 如何在 perl 程序中查找打开的全局文件句柄

    我刚刚发现一个问题 我必须关闭所有打开的文件句柄才能让我的 Apache cgi 脚本继续 我将问题追溯到 Parse RecDescent usr bin env perl use strict use warnings use feat
  • Twitter Streaming API 使用的官方编码?是UTF-8吗?

    Twitter 流 API 的官方编码是什么 根据我所看到的 我最好的猜测是 UTF 8 但我想避免做出假设 我见过的 Twitter 网站上唯一暗示他们使用什么作为官方编码的部分是在这里 Twitter 不想因为我们使用 UTF 8 或相
  • #1115 - 未知字符集:'utf8mb4'

    我的电脑上运行着一个本地网络服务器 用于本地开发 我现在正处于导出数据库并导入到我的托管 VPS 的阶段 导出然后导入时出现以下错误 1115 未知字符集 utf8mb4 有人能指出我正确的方向吗 该错误明确表明您没有utf8mb4您的阶段
  • 正则表达式从字符串中提取 IP 和端口

    我正在使用 Perl 尝试从字符串中提取 IP 地址和端口 我尝试使用的正则表达式是 s sip 字符串是 sip 255 255 255 255 8080 transport TCP sip 255 255 255 255 8080 显然
  • 向用户提示多个问题(是/否和文件名输入)

    我想问用户多个问题 我有两种类型的问题 是 否或文件名输入 我不知道如何将这一切放入一个好的if结构 我不确定是否也应该使用 else 语句 有人可以帮我们解决这个问题吗 这是我到目前为止所拥有的 print Do you want to
  • 我怎样才能挂钩 Perl 的 use/require 以便抛出异常?

    如果文件已经加载 是否可以挂载到use require所以我可以抛出异常 在我即将到来的nextgen blacklist http github com EvanCarroll nextgen blob blacklist lib nex
  • 如何使用 Perl CGI 脚本提供图像?

    我的 Google fu 让我失望了 如何使用 Perl 提供已生成的图像 Example img src getimage pl getimage pl 里有什么 干得好 usr bin perl w my file inner nav

随机推荐

  • 致命异常:发布版本中的 java.lang.NullPointerException

    我在应用程序的发布版本中面临一个奇怪的问题 这是我的例外 Fatal Exception java lang NullPointerException throw with null exception in hopq hopq authe
  • 使用 Nokogiri 查找 id 包含 [] 的标签

    我有一个 html 元素 例如 div 我想通过 id 搜索这个元素 但 nokogiri 似乎被 搞糊涂了 我想 doc css spam eggs id 但无济于事 克里斯 试试这个 让我知道它是否有效 doc Nokogiri HTM
  • QStateMachine - QMouseEvent

    在另一个问题中 你告诉我使用 QStateMachine 我是 Qt 的新手 这是我第一次使用这些对象 所以我犯了很多逻辑错误 所以使用 QStateMachine 这是一个大问题 这是唯一的方法吗 我尝试解释一下我的程序 我想创建一个纸牌
  • Play 2.0 中的 session.id 在哪里?

    在 Play 1 0 中 我们使用 session getId 方法来检索唯一的会话标识符 id 可以方便地为全局缓存中的键添加前缀 Play 2 0 session id 等效项在哪里 由于会话数据存储为 cookie 因此 play 2
  • 使用 RLE 读取和压缩图片

    目前我正在学习 python 我想更多地了解数据压缩 所以我决定尝试编写运行长度编码 RLE 根据我的阅读 当您尝试压缩图片时它会很有用 我想知道对于初学者来说最简单的图像文件类型是什么 如何使用 python 从图片中读取像素 RGB 值
  • Android DrawBitMap 使用 ARGB_8888 时非常慢

    我发现 DrawBitMap 只绘制三个位图需要 50 60 毫秒 一个是占据整个屏幕的矩形 一个是圆形 另一个是路径 我的位图是通过在空白位图上使用 Canvas drawPath drawRect 和 drawCircle 创建的 Bi
  • gem 和/或 Ruby on Rails 突然崩溃了,有人知道发生了什么吗?

    我有一个 Ruby on Rails 应用程序 曾经可以工作 我已经有一个月左右没有使用它了 但今天尝试启动它rails s并收到以下错误 事实上 当我尝试时 我收到此错误rails h or rails v甚至gem h or sudo
  • java.lang.NoClassDefFoundError:以下 Lollipop 版本上的 com.parse.Parse$Configuration$Builder

    我在我的应用程序中使用 parse com sdk 它与 Lollipop 配合得非常好 但是当我在以下棒棒糖版本上运行该应用程序时 我收到此错误 java lang NoClassDefFoundError com parse Parse
  • EXE 或 DLL 映像基地址

    C Windows 中有没有办法获取 exe DLL 映像基地址 谢谢 如果您将二进制文件加载到您自己的进程中 您可以使用获取模块句柄 http msdn microsoft com en us library ms683199 VS 85
  • 如何在 Swift 中使用 CMAltitudeHandler?

    self altimeter startRelativeAltitudeUpdatesToQueue NSOperationQueue mainQueue withHandler CMAltitudeData altitudeData NS
  • 导入可出租运算符和可观察创建方法

    我正在升级到 Angular 5 和 RxJS 5 5 2 并尝试导入Observable of操作员 在可出租运营商之前 我们是这样做的 import rxjs add observable of Usage Observable of
  • 带表达式的 C++ 模板参数

    我在使用 C 时遇到了麻烦 我希望能够将表达式作为参数放入模板中 这是我的代码 include
  • 从 Java Web 应用程序控制 C 应用程序

    我有 C 应用程序将在不同站点的多台计算机上运行 现在我想控制和监视这些C应用程序 为此 我正在考虑使用 Servlet JSP 的 Java Web 应用程序 我认为 C 应用程序将通过 TCP 连接到 Java Web 应用程序 在我的
  • 如何使用 Wireshark 从 TCP 数据包中提取原始数据

    对 Wireshark 完全陌生 想知道如何从我在 Wireshark 上收到的 TCP 数据包中提取数据 我目前正在使用带有 Grove 传感器的树莓派并获取压力和温度值 我将这些值发送到云中的服务器并且它正在工作 我正在使用wiresh
  • 如何在javascript中打开没有任何栏(如地址栏、书签栏等)的浏览器窗口?

    我希望打开一个没有任何地址栏 书签栏的网址 html 文件 以便用户只看到应用程序窗口 有办法这样做吗 window open url window toolbar no menubar no resizable yes 您可以阅读这些以及
  • 顺序一致性和原子性有什么区别?

    我读到 java 易失性是顺序一致的 但不是原子的 对于原子性java提供了不同的库 有人可以用简单的英语解释两者之间的区别吗 我相信问题范围包括 C C 因此添加这些语言标签以获得更多受众 想象一下一个类中的这两个变量 int i 0 v
  • 为什么 GridView 内的 LinkBut​​ton 不会引发其 OnClick 事件?

    我在 GridView 中有一个 LinkBut ton 通过 TemplateField 无论我如何尝试 LinkBut ton 都不会调用其事件处理程序 我都尝试过 传统的事件处理程序 OnClick GridView 级别的 OnRo
  • 根据中心性对顶点着色

    我正在尝试更改 igraph 生成的图形中顶点的颜色 更具体地说 我有一个从邻接矩阵创建的 95 个节点图 我想根据它们的度数 介数 特征值中心性 接近度对它们进行着色 但我猜在我知道如何用它来做之后 我可以和其他人一起做 所以到目前为止我
  • ChartJS 不使用 Moment.js 显示时间数据

    我正在尝试按小时绘制给定日期的一系列数据点 并非每个小时都包含在数据集中 但我仍然想显示从 0 00 23 00 的时间并绘制可用的数据点 我的错误是 该方法未实现 要么找不到适配器 要么找不到适配器 提供了不完整的集成 然而 纵观文档 h
  • 在 Perl 中将 UTF8 字符串转换为 ASCII

    我已经尝试了 Google 和 StackOverflow 推荐的 我能找到的 所有内容 包括使用 Encode 我的代码可以工作 但它只使用 UTF8 并且我收到宽字符警告 我知道如何解决这些警告 但我没有将 UTF8 用于其他任何用途