【问题标题】:Perl convert string to readable formatPerl 将字符串转换为可读格式
【发布时间】:2020-08-20 01:27:37
【问题描述】:

我有字符串并且想要转换为显示人类可读的格式。下面是字符串并解码为可读格式,如 σταύρος。我尝试过 utf8 编码,但没有奏效。

σταÏÏος

我尝试了很多方法,但不清楚使用什么编码将其转换为 σταύρος

【问题讨论】:

  • 你是怎么得到这个字符串的?
  • 我从数据库中得到了相同的字符串,但不知道它是如何编码的。在网页上加载时,它显示 σταύρος,但是当我从数据库中获取并显示时,它以编码形式显示。
  • 通过在脚本/包中获取值时添加use Devel::Peek; Dump( $text );,您可以在错误日志中看到确切的数据。
  • 你的终端的codepage是什么,字符串显示encoded?对于该字符串正确显示的页面,您在 Web 浏览器中有什么代码页/编码? (提示:查看网页的来源)。对于分配的希腊语言 iso-8859-7 代码页编码 Encode::Supported
  • 你是如何从数据库中得到它的?使用 DBI?如果是这样,什么 DBD? mysql?如果是这样,您是否使用了mysql_enable_utf8mb4?如果是这样,sprintf("%vX", $s) 的输出对于您从 db 获得的刺痛是什么?你收到3C3.3C4.3B1.3CD.3C1.3BF.3C2了吗?如果是这样,您从数据库中获得了正确的字符串,问题在于您如何对输出进行编码。如果没有,您没有从数据库中获得正确的字符串。

标签: perl encoding utf-8


【解决方案1】:

您的示例在我的浏览器中如下所示: 当您发布有关如何呈现字符的问题时,您应该始终包含图像。这些字符在其他人的计算机上可能与在您的计算机上呈现的不同。它们甚至可以被 Stack Overflow 服务器重新编码。在这个答案中,我假设 SO 传递的字节与您发布的相同,并且我看到的内容与您看到的相同。

数据库以 UTF-8 格式提供您的字符,但它们被呈现为 Windows-1252。第一个问题是 Perl 是否知道它正在获取 UTF-8 字符。 length $tring 会告诉你 Perl 认为它看到了多少个字符。如果是 7,那么 Perl 就知道数据是 UTF-8 格式的。如果是 14,那么 Perl 不确定它有什么,所以它只是计算字节数。如果是 12,那么 Perl 已经确定数据在 Windows-1252 中(您的两个字节被丢弃为无效字符)。

我猜你会得到 14,所以 Perl 使用 shell 的默认编码作为输出。你在 Windows 机器上吗?如果你得到 12 或 14,那么你需要告诉 Perl 输入数据是 UTF-8 格式的。如果您正在从文件句柄中读取,那么您只需在打开文件句柄后立即插入行 binmode FH, ':encoding(UTF-8)' 即可。我的猜测是您正在使用数据库 API 包。如果是这样,那么您需要阅读包的文档以了解如何设置编码。

如果length $tring 给出 7,那么 Perl 知道它有什么,问题出在输出上。如果您需要这方面的帮助,那么您需要在您的问题中添加有关如何查看输出的详细信息。如果您只是打印到终端,请在开始打印之前尝试binmode STDOUT, ':encoding(UTF-8)'

如果你想检查 Perl 看到的数据,那么使用unpack 'H*', $tring。您将获得 cf83cf84ceb1cf8dcf81cebfcf82 或 cf83cf84ceb1cfcfcebfcf82,这取决于 Perl 是否已经丢弃了两个无效的 Windows-1252 字节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    • 1970-01-01
    • 2019-05-12
    • 2019-04-01
    • 1970-01-01
    • 2023-02-10
    相关资源
    最近更新 更多